diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index bb703ed..dfd75d0 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -288,6 +288,7 @@
   include/windows.applicationmodel.core.idl \
   include/windows.applicationmodel.idl \
   include/windows.data.json.idl \
+  include/windows.data.xml.dom.idl \
   include/windows.devices.bluetooth.idl \
   include/windows.devices.enumeration.idl \
   include/windows.devices.geolocation.idl \
@@ -328,6 +329,7 @@
   include/windows.perception.spatial.idl \
   include/windows.perception.spatial.surfaces.idl \
   include/windows.security.authentication.onlineid.idl \
+  include/windows.security.authorization.appcapabilityaccess.idl \
   include/windows.security.credentials.idl \
   include/windows.security.credentials.ui.idl \
   include/windows.security.cryptography.idl \
@@ -350,6 +352,8 @@
   include/windows.ui.core.idl \
   include/windows.ui.viewmanagement.idl \
   include/windows.ui.xaml.hosting.desktopwindowxamlsource.idl \
+  include/windows.ui.xaml.idl \
+  include/windows.ui.xaml.interop.idl \
   include/windowscontracts.idl \
   include/wmcodecdsp.idl \
   include/wmdrmsdk.idl \
diff --git a/mingw-w64-headers/Makefile.in b/mingw-w64-headers/Makefile.in
index 726556e..ec3aab2 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -590,6 +590,7 @@
 @HAVE_WIDL_TRUE@  include/windows.applicationmodel.core.idl \
 @HAVE_WIDL_TRUE@  include/windows.applicationmodel.idl \
 @HAVE_WIDL_TRUE@  include/windows.data.json.idl \
+@HAVE_WIDL_TRUE@  include/windows.data.xml.dom.idl \
 @HAVE_WIDL_TRUE@  include/windows.devices.bluetooth.idl \
 @HAVE_WIDL_TRUE@  include/windows.devices.enumeration.idl \
 @HAVE_WIDL_TRUE@  include/windows.devices.geolocation.idl \
@@ -630,6 +631,7 @@
 @HAVE_WIDL_TRUE@  include/windows.perception.spatial.idl \
 @HAVE_WIDL_TRUE@  include/windows.perception.spatial.surfaces.idl \
 @HAVE_WIDL_TRUE@  include/windows.security.authentication.onlineid.idl \
+@HAVE_WIDL_TRUE@  include/windows.security.authorization.appcapabilityaccess.idl \
 @HAVE_WIDL_TRUE@  include/windows.security.credentials.idl \
 @HAVE_WIDL_TRUE@  include/windows.security.credentials.ui.idl \
 @HAVE_WIDL_TRUE@  include/windows.security.cryptography.idl \
@@ -652,6 +654,8 @@
 @HAVE_WIDL_TRUE@  include/windows.ui.core.idl \
 @HAVE_WIDL_TRUE@  include/windows.ui.viewmanagement.idl \
 @HAVE_WIDL_TRUE@  include/windows.ui.xaml.hosting.desktopwindowxamlsource.idl \
+@HAVE_WIDL_TRUE@  include/windows.ui.xaml.idl \
+@HAVE_WIDL_TRUE@  include/windows.ui.xaml.interop.idl \
 @HAVE_WIDL_TRUE@  include/windowscontracts.idl \
 @HAVE_WIDL_TRUE@  include/wmcodecdsp.idl \
 @HAVE_WIDL_TRUE@  include/wmdrmsdk.idl \
diff --git a/mingw-w64-headers/include/windows.applicationmodel.h b/mingw-w64-headers/include/windows.applicationmodel.h
index d88a319..e7c036c 100644
--- a/mingw-w64-headers/include/windows.applicationmodel.h
+++ b/mingw-w64-headers/include/windows.applicationmodel.h
@@ -41,6 +41,36 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics ABI::Windows::ApplicationModel::IDesignModeStatics
+namespace ABI {
+    namespace Windows {
+        namespace ApplicationModel {
+            interface IDesignModeStatics;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 ABI::Windows::ApplicationModel::IDesignModeStatics2
+namespace ABI {
+    namespace Windows {
+        namespace ApplicationModel {
+            interface IDesignModeStatics2;
+        }
+    }
+}
+#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;
@@ -236,6 +266,21 @@
 #endif /* defined __cplusplus */
 #endif /* defined ____x_ABI_CWindows_CApplicationModel_CAppDisplayInfo_FWD_DEFINED__ */
 
+#ifndef ____x_ABI_CWindows_CApplicationModel_CDesignMode_FWD_DEFINED__
+#define ____x_ABI_CWindows_CApplicationModel_CDesignMode_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace ApplicationModel {
+            class DesignMode;
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CApplicationModel_CDesignMode __x_ABI_CWindows_CApplicationModel_CDesignMode;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CApplicationModel_CDesignMode_FWD_DEFINED__ */
+
 #ifndef ____x_ABI_CWindows_CApplicationModel_CEnteredBackgroundEventArgs_FWD_DEFINED__
 #define ____x_ABI_CWindows_CApplicationModel_CEnteredBackgroundEventArgs_FWD_DEFINED__
 #ifdef __cplusplus
@@ -467,6 +512,36 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics ABI::Windows::ApplicationModel::IDesignModeStatics
+namespace ABI {
+    namespace Windows {
+        namespace ApplicationModel {
+            interface IDesignModeStatics;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 ABI::Windows::ApplicationModel::IDesignModeStatics2
+namespace ABI {
+    namespace Windows {
+        namespace ApplicationModel {
+            interface IDesignModeStatics2;
+        }
+    }
+}
+#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;
@@ -869,6 +944,258 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*****************************************************************************
+ * IDesignModeStatics interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIDesignModeStatics, 0x2c3893cc, 0xf81a, 0x4e7a, 0xb8,0x57, 0x76,0xa8,0x08,0x87,0xe1,0x85);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace ApplicationModel {
+            MIDL_INTERFACE("2c3893cc-f81a-4e7a-b857-76a80887e185")
+            IDesignModeStatics : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_DesignModeEnabled(
+                    boolean *value) = 0;
+
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics, 0x2c3893cc, 0xf81a, 0x4e7a, 0xb8,0x57, 0x76,0xa8,0x08,0x87,0xe1,0x85)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CApplicationModel_CIDesignModeStaticsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics *This,
+        TrustLevel *trustLevel);
+
+    /*** IDesignModeStatics methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_DesignModeEnabled)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics *This,
+        boolean *value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CApplicationModel_CIDesignModeStaticsVtbl;
+
+interface __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics {
+    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIDesignModeStaticsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDesignModeStatics methods ***/
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_get_DesignModeEnabled(This,value) (This)->lpVtbl->get_DesignModeEnabled(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_AddRef(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_Release(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_GetIids(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDesignModeStatics methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_get_DesignModeEnabled(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics* This,boolean *value) {
+    return This->lpVtbl->get_DesignModeEnabled(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_ApplicationModel
+#define IID_IDesignModeStatics IID___x_ABI_CWindows_CApplicationModel_CIDesignModeStatics
+#define IDesignModeStaticsVtbl __x_ABI_CWindows_CApplicationModel_CIDesignModeStaticsVtbl
+#define IDesignModeStatics __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics
+#define IDesignModeStatics_QueryInterface __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_QueryInterface
+#define IDesignModeStatics_AddRef __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_AddRef
+#define IDesignModeStatics_Release __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_Release
+#define IDesignModeStatics_GetIids __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_GetIids
+#define IDesignModeStatics_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_GetRuntimeClassName
+#define IDesignModeStatics_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_GetTrustLevel
+#define IDesignModeStatics_get_DesignModeEnabled __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_get_DesignModeEnabled
+#endif /* WIDL_using_Windows_ApplicationModel */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDesignModeStatics2 interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
+#ifndef ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2, 0x80cf8137, 0xb064, 0x4858, 0xbe,0xc8, 0x3e,0xba,0x22,0x35,0x75,0x35);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace ApplicationModel {
+            MIDL_INTERFACE("80cf8137-b064-4858-bec8-3eba22357535")
+            IDesignModeStatics2 : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_DesignMode2Enabled(
+                    boolean *value) = 0;
+
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2, 0x80cf8137, 0xb064, 0x4858, 0xbe,0xc8, 0x3e,0xba,0x22,0x35,0x75,0x35)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 *This,
+        TrustLevel *trustLevel);
+
+    /*** IDesignModeStatics2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_DesignMode2Enabled)(
+        __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 *This,
+        boolean *value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2Vtbl;
+
+interface __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2 {
+    CONST_VTBL __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDesignModeStatics2 methods ***/
+#define __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_get_DesignMode2Enabled(This,value) (This)->lpVtbl->get_DesignMode2Enabled(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_QueryInterface(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_AddRef(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_Release(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_GetIids(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_GetRuntimeClassName(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_GetTrustLevel(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDesignModeStatics2 methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_get_DesignMode2Enabled(__x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2* This,boolean *value) {
+    return This->lpVtbl->get_DesignMode2Enabled(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_ApplicationModel
+#define IID_IDesignModeStatics2 IID___x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2
+#define IDesignModeStatics2Vtbl __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2Vtbl
+#define IDesignModeStatics2 __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2
+#define IDesignModeStatics2_QueryInterface __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_QueryInterface
+#define IDesignModeStatics2_AddRef __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_AddRef
+#define IDesignModeStatics2_Release __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_Release
+#define IDesignModeStatics2_GetIids __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_GetIids
+#define IDesignModeStatics2_GetRuntimeClassName __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_GetRuntimeClassName
+#define IDesignModeStatics2_GetTrustLevel __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_GetTrustLevel
+#define IDesignModeStatics2_get_DesignMode2Enabled __x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_get_DesignMode2Enabled
+#endif /* WIDL_using_Windows_ApplicationModel */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CApplicationModel_CIDesignModeStatics2_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */
+
+/*****************************************************************************
  * IEnteredBackgroundEventArgs interface
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
@@ -2766,6 +3093,22 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*
+ * Class Windows.ApplicationModel.DesignMode
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_ApplicationModel_DesignMode_DEFINED
+#define RUNTIMECLASS_Windows_ApplicationModel_DesignMode_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_ApplicationModel_DesignMode[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','e','s','i','g','n','M','o','d','e',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DesignMode[] = L"Windows.ApplicationModel.DesignMode";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_ApplicationModel_DesignMode[] = {'W','i','n','d','o','w','s','.','A','p','p','l','i','c','a','t','i','o','n','M','o','d','e','l','.','D','e','s','i','g','n','M','o','d','e',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_ApplicationModel_DesignMode_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
  * Class Windows.ApplicationModel.EnteredBackgroundEventArgs
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
diff --git a/mingw-w64-headers/include/windows.applicationmodel.idl b/mingw-w64-headers/include/windows.applicationmodel.idl
index 3d6f4c6..d9c4a09 100644
--- a/mingw-w64-headers/include/windows.applicationmodel.idl
+++ b/mingw-w64-headers/include/windows.applicationmodel.idl
@@ -36,6 +36,8 @@
     typedef struct PackageVersion PackageVersion;
 
     interface IAppDisplayInfo;
+    interface IDesignModeStatics;
+    interface IDesignModeStatics2;
     interface IEnteredBackgroundEventArgs;
     interface ILeavingBackgroundEventArgs;
     interface IPackage;
@@ -50,6 +52,7 @@
     interface ISuspendingOperation;
 
     runtimeclass AppDisplayInfo;
+    runtimeclass DesignMode;
     runtimeclass EnteredBackgroundEventArgs;
     runtimeclass LeavingBackgroundEventArgs;
     runtimeclass Package;
@@ -95,6 +98,26 @@
     }
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.ApplicationModel.DesignMode),
+        uuid(2c3893cc-f81a-4e7a-b857-76a80887e185)
+    ]
+    interface IDesignModeStatics : IInspectable
+    {
+        [propget] HRESULT DesignModeEnabled([out, retval] boolean *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 5.0),
+        exclusiveto(Windows.ApplicationModel.DesignMode),
+        uuid(80cf8137-b064-4858-bec8-3eba22357535)
+    ]
+    interface IDesignModeStatics2 : IInspectable
+    {
+        [propget] HRESULT DesignMode2Enabled([out, retval] boolean *value);
+    }
+
+    [
         contract(Windows.Foundation.UniversalApiContract, 3.0),
         uuid(f722dcc2-9827-403d-aaed-ecca9ac17398)
     ]
@@ -250,6 +273,18 @@
         [default] interface Windows.ApplicationModel.IAppDisplayInfo;
     }
 
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        static(Windows.ApplicationModel.IDesignModeStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        static(Windows.ApplicationModel.IDesignModeStatics2, Windows.Foundation.UniversalApiContract, 5.0),
+        threading(both)
+    ]
+    runtimeclass DesignMode
+    {
+    }
+
     [
         contract(Windows.Foundation.UniversalApiContract, 3.0),
         marshaling_behavior(agile)
diff --git a/mingw-w64-headers/include/windows.data.xml.dom.h b/mingw-w64-headers/include/windows.data.xml.dom.h
new file mode 100644
index 0000000..41347eb
--- /dev/null
+++ b/mingw-w64-headers/include/windows.data.xml.dom.h
@@ -0,0 +1,6494 @@
+/*** Autogenerated by WIDL 9.18 from include/windows.data.xml.dom.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_data_xml_dom_h__
+#define __windows_data_xml_dom_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_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity ABI::Windows::Data::Xml::Dom::IDtdEntity
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IDtdEntity;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation ABI::Windows::Data::Xml::Dom::IDtdNotation
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IDtdNotation;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute ABI::Windows::Data::Xml::Dom::IXmlAttribute
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlAttribute;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection ABI::Windows::Data::Xml::Dom::IXmlCDataSection
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlCDataSection;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData ABI::Windows::Data::Xml::Dom::IXmlCharacterData
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlCharacterData;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment ABI::Windows::Data::Xml::Dom::IXmlComment
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlComment;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument ABI::Windows::Data::Xml::Dom::IXmlDocument
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocument;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment ABI::Windows::Data::Xml::Dom::IXmlDocumentFragment
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocumentFragment;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO ABI::Windows::Data::Xml::Dom::IXmlDocumentIO
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocumentIO;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 ABI::Windows::Data::Xml::Dom::IXmlDocumentIO2
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocumentIO2;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics ABI::Windows::Data::Xml::Dom::IXmlDocumentStatics
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocumentStatics;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType ABI::Windows::Data::Xml::Dom::IXmlDocumentType
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocumentType;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation ABI::Windows::Data::Xml::Dom::IXmlDomImplementation
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDomImplementation;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement ABI::Windows::Data::Xml::Dom::IXmlElement
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlElement;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference ABI::Windows::Data::Xml::Dom::IXmlEntityReference
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlEntityReference;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings ABI::Windows::Data::Xml::Dom::IXmlLoadSettings
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlLoadSettings;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlNamedNodeMap;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode ABI::Windows::Data::Xml::Dom::IXmlNode
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlNode;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList ABI::Windows::Data::Xml::Dom::IXmlNodeList
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlNodeList;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector ABI::Windows::Data::Xml::Dom::IXmlNodeSelector
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlNodeSelector;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer ABI::Windows::Data::Xml::Dom::IXmlNodeSerializer
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlNodeSerializer;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction ABI::Windows::Data::Xml::Dom::IXmlProcessingInstruction
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlProcessingInstruction;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText ABI::Windows::Data::Xml::Dom::IXmlText
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlText;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CDtdEntity_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CDtdEntity_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class DtdEntity;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CDtdEntity;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CDtdEntity_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CDtdNotation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CDtdNotation_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class DtdNotation;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CDtdNotation;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CDtdNotation_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlAttribute;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlCDataSection;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlComment_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlComment_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlComment;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlComment __x_ABI_CWindows_CData_CXml_CDom_CXmlComment;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlComment_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocument_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocument_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlDocument;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CXmlDocument;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocument_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlDocumentFragment;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlDocumentType;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlDomImplementation;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlElement_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlElement_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlElement;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlElement __x_ABI_CWindows_CData_CXml_CDom_CXmlElement;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlElement_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlEntityReference;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlLoadSettings;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlNamedNodeMap;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlNodeList;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlProcessingInstruction;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlText_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlText_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    class XmlText;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlText __x_ABI_CWindows_CData_CXml_CDom_CXmlText;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlText_FWD_DEFINED__ */
+
+#ifndef ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+#define ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+typedef interface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode;
+#ifdef __cplusplus
+#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+#define ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+typedef interface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode;
+#ifdef __cplusplus
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+#define ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+typedef interface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode;
+#ifdef __cplusplus
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
+typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument;
+#ifdef __cplusplus
+#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* >
+#endif /* __cplusplus */
+#endif
+
+/* Headers for imported files */
+
+#include <inspectable.h>
+#include <asyncinfo.h>
+#include <eventtoken.h>
+#include <windowscontracts.h>
+#include <windows.foundation.h>
+#include <windows.storage.h>
+#include <windows.storage.streams.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __cplusplus
+typedef enum __x_ABI_CWindows_CData_CXml_CDom_CNodeType __x_ABI_CWindows_CData_CXml_CDom_CNodeType;
+#endif /* __cplusplus */
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity ABI::Windows::Data::Xml::Dom::IDtdEntity
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IDtdEntity;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation ABI::Windows::Data::Xml::Dom::IDtdNotation
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IDtdNotation;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute ABI::Windows::Data::Xml::Dom::IXmlAttribute
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlAttribute;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection ABI::Windows::Data::Xml::Dom::IXmlCDataSection
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlCDataSection;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData ABI::Windows::Data::Xml::Dom::IXmlCharacterData
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlCharacterData;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment ABI::Windows::Data::Xml::Dom::IXmlComment
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlComment;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument ABI::Windows::Data::Xml::Dom::IXmlDocument
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocument;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment ABI::Windows::Data::Xml::Dom::IXmlDocumentFragment
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocumentFragment;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO ABI::Windows::Data::Xml::Dom::IXmlDocumentIO
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocumentIO;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 ABI::Windows::Data::Xml::Dom::IXmlDocumentIO2
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocumentIO2;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics ABI::Windows::Data::Xml::Dom::IXmlDocumentStatics
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocumentStatics;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType ABI::Windows::Data::Xml::Dom::IXmlDocumentType
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDocumentType;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation ABI::Windows::Data::Xml::Dom::IXmlDomImplementation
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlDomImplementation;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement ABI::Windows::Data::Xml::Dom::IXmlElement
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlElement;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference ABI::Windows::Data::Xml::Dom::IXmlEntityReference
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlEntityReference;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings ABI::Windows::Data::Xml::Dom::IXmlLoadSettings
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlLoadSettings;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlNamedNodeMap;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode ABI::Windows::Data::Xml::Dom::IXmlNode
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlNode;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList ABI::Windows::Data::Xml::Dom::IXmlNodeList
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlNodeList;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector ABI::Windows::Data::Xml::Dom::IXmlNodeSelector
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlNodeSelector;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer ABI::Windows::Data::Xml::Dom::IXmlNodeSerializer
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlNodeSerializer;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction ABI::Windows::Data::Xml::Dom::IXmlProcessingInstruction
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlProcessingInstruction;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText ABI::Windows::Data::Xml::Dom::IXmlText
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    interface IXmlText;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+#define ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+typedef interface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode;
+#ifdef __cplusplus
+#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+#define ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+typedef interface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode;
+#ifdef __cplusplus
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+#define ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
+typedef interface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode;
+#ifdef __cplusplus
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* >
+#endif /* __cplusplus */
+#endif
+
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    enum NodeType {
+                        NodeType_Invalid = 0,
+                        NodeType_ElementNode = 1,
+                        NodeType_AttributeNode = 2,
+                        NodeType_TextNode = 3,
+                        NodeType_DataSectionNode = 4,
+                        NodeType_EntityReferenceNode = 5,
+                        NodeType_EntityNode = 6,
+                        NodeType_ProcessingInstructionNode = 7,
+                        NodeType_CommentNode = 8,
+                        NodeType_DocumentNode = 9,
+                        NodeType_DocumentTypeNode = 10,
+                        NodeType_DocumentFragmentNode = 11,
+                        NodeType_NotationNode = 12
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CData_CXml_CDom_CNodeType {
+    NodeType_Invalid = 0,
+    NodeType_ElementNode = 1,
+    NodeType_AttributeNode = 2,
+    NodeType_TextNode = 3,
+    NodeType_DataSectionNode = 4,
+    NodeType_EntityReferenceNode = 5,
+    NodeType_EntityNode = 6,
+    NodeType_ProcessingInstructionNode = 7,
+    NodeType_CommentNode = 8,
+    NodeType_DocumentNode = 9,
+    NodeType_DocumentTypeNode = 10,
+    NodeType_DocumentFragmentNode = 11,
+    NodeType_NotationNode = 12
+};
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define NodeType __x_ABI_CWindows_CData_CXml_CDom_CNodeType
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+/*****************************************************************************
+ * IDtdEntity interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity, 0x6a0b5ffc, 0x63b4, 0x480f, 0x9e,0x6a, 0x8a,0x92,0x81,0x6a,0xad,0xe4);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("6a0b5ffc-63b4-480f-9e6a-8a92816aade4")
+                    IDtdEntity : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_PublicId(
+                            IInspectable **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_SystemId(
+                            IInspectable **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_NotationName(
+                            IInspectable **value) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity, 0x6a0b5ffc, 0x63b4, 0x480f, 0x9e,0x6a, 0x8a,0x92,0x81,0x6a,0xad,0xe4)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
+        TrustLevel *trustLevel);
+
+    /*** IDtdEntity methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_PublicId)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_SystemId)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_NotationName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
+        IInspectable **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDtdEntity methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_PublicId(This,value) (This)->lpVtbl->get_PublicId(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_SystemId(This,value) (This)->lpVtbl->get_SystemId(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_NotationName(This,value) (This)->lpVtbl->get_NotationName(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_Release(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDtdEntity methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_PublicId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,IInspectable **value) {
+    return This->lpVtbl->get_PublicId(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_SystemId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,IInspectable **value) {
+    return This->lpVtbl->get_SystemId(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_NotationName(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,IInspectable **value) {
+    return This->lpVtbl->get_NotationName(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IDtdEntity IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity
+#define IDtdEntityVtbl __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl
+#define IDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity
+#define IDtdEntity_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_QueryInterface
+#define IDtdEntity_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_AddRef
+#define IDtdEntity_Release __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_Release
+#define IDtdEntity_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetIids
+#define IDtdEntity_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetRuntimeClassName
+#define IDtdEntity_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetTrustLevel
+#define IDtdEntity_get_PublicId __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_PublicId
+#define IDtdEntity_get_SystemId __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_SystemId
+#define IDtdEntity_get_NotationName __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_NotationName
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDtdNotation interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation, 0x8cb4e04d, 0x6d46, 0x4edb, 0xab,0x73, 0xdf,0x83,0xc5,0x1a,0xd3,0x97);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("8cb4e04d-6d46-4edb-ab73-df83c51ad397")
+                    IDtdNotation : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_PublicId(
+                            IInspectable **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_SystemId(
+                            IInspectable **value) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation, 0x8cb4e04d, 0x6d46, 0x4edb, 0xab,0x73, 0xdf,0x83,0xc5,0x1a,0xd3,0x97)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
+        TrustLevel *trustLevel);
+
+    /*** IDtdNotation methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_PublicId)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_SystemId)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
+        IInspectable **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDtdNotation methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_PublicId(This,value) (This)->lpVtbl->get_PublicId(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_SystemId(This,value) (This)->lpVtbl->get_SystemId(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_Release(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDtdNotation methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_PublicId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,IInspectable **value) {
+    return This->lpVtbl->get_PublicId(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_SystemId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,IInspectable **value) {
+    return This->lpVtbl->get_SystemId(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IDtdNotation IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation
+#define IDtdNotationVtbl __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl
+#define IDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation
+#define IDtdNotation_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_QueryInterface
+#define IDtdNotation_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_AddRef
+#define IDtdNotation_Release __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_Release
+#define IDtdNotation_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetIids
+#define IDtdNotation_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetRuntimeClassName
+#define IDtdNotation_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetTrustLevel
+#define IDtdNotation_get_PublicId __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_PublicId
+#define IDtdNotation_get_SystemId __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_SystemId
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlAttribute interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute, 0xac144aa4, 0xb4f1, 0x4db6, 0xb2,0x06, 0x8a,0x22,0xc3,0x08,0xdb,0x0a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("ac144aa4-b4f1-4db6-b206-8a22c308db0a")
+                    IXmlAttribute : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_Name(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_Specified(
+                            boolean *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_Value(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_Value(
+                            HSTRING value) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute, 0xac144aa4, 0xb4f1, 0x4db6, 0xb2,0x06, 0x8a,0x22,0xc3,0x08,0xdb,0x0a)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlAttribute methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Name)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Specified)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_Value)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
+        HSTRING value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlAttribute methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Specified(This,value) (This)->lpVtbl->get_Specified(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_put_Value(This,value) (This)->lpVtbl->put_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlAttribute methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Name(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING *value) {
+    return This->lpVtbl->get_Name(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Specified(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,boolean *value) {
+    return This->lpVtbl->get_Specified(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Value(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_put_Value(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING value) {
+    return This->lpVtbl->put_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlAttribute IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute
+#define IXmlAttributeVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl
+#define IXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute
+#define IXmlAttribute_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_QueryInterface
+#define IXmlAttribute_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_AddRef
+#define IXmlAttribute_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_Release
+#define IXmlAttribute_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetIids
+#define IXmlAttribute_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetRuntimeClassName
+#define IXmlAttribute_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetTrustLevel
+#define IXmlAttribute_get_Name __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Name
+#define IXmlAttribute_get_Specified __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Specified
+#define IXmlAttribute_get_Value __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Value
+#define IXmlAttribute_put_Value __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_put_Value
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlCDataSection interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection, 0x4d04b46f, 0xc8bd, 0x45b4, 0x88,0x99, 0x04,0x00,0xd7,0xc2,0xc6,0x0f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("4d04b46f-c8bd-45b4-8899-0400d7c2c60f")
+                    IXmlCDataSection : public IInspectable
+                    {
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection, 0x4d04b46f, 0xc8bd, 0x45b4, 0x88,0x99, 0x04,0x00,0xd7,0xc2,0xc6,0x0f)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
+        TrustLevel *trustLevel);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlCDataSection IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection
+#define IXmlCDataSectionVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl
+#define IXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection
+#define IXmlCDataSection_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_QueryInterface
+#define IXmlCDataSection_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_AddRef
+#define IXmlCDataSection_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_Release
+#define IXmlCDataSection_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetIids
+#define IXmlCDataSection_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetRuntimeClassName
+#define IXmlCDataSection_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetTrustLevel
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlCharacterData interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData, 0x132e42ab, 0x4e36, 0x4df6, 0xb1,0xc8, 0x0c,0xe6,0x2f,0xd8,0x8b,0x26);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("132e42ab-4e36-4df6-b1c8-0ce62fd88b26")
+                    IXmlCharacterData : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_Data(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_Data(
+                            HSTRING value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_Length(
+                            UINT32 *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SubstringData(
+                            UINT32 offset,
+                            UINT32 count,
+                            HSTRING *data) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE AppendData(
+                            HSTRING data) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE InsertData(
+                            UINT32 offset,
+                            HSTRING data) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE DeleteData(
+                            UINT32 offset,
+                            UINT32 count) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE ReplaceData(
+                            UINT32 offset,
+                            UINT32 count,
+                            HSTRING data) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData, 0x132e42ab, 0x4e36, 0x4df6, 0xb1,0xc8, 0x0c,0xe6,0x2f,0xd8,0x8b,0x26)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlCharacterData methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Data)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_Data)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        HSTRING value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Length)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        UINT32 *value);
+
+    HRESULT (STDMETHODCALLTYPE *SubstringData)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        UINT32 offset,
+        UINT32 count,
+        HSTRING *data);
+
+    HRESULT (STDMETHODCALLTYPE *AppendData)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        HSTRING data);
+
+    HRESULT (STDMETHODCALLTYPE *InsertData)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        UINT32 offset,
+        HSTRING data);
+
+    HRESULT (STDMETHODCALLTYPE *DeleteData)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        UINT32 offset,
+        UINT32 count);
+
+    HRESULT (STDMETHODCALLTYPE *ReplaceData)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
+        UINT32 offset,
+        UINT32 count,
+        HSTRING data);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlCharacterData methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_put_Data(This,value) (This)->lpVtbl->put_Data(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_SubstringData(This,offset,count,data) (This)->lpVtbl->SubstringData(This,offset,count,data)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AppendData(This,data) (This)->lpVtbl->AppendData(This,data)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_InsertData(This,offset,data) (This)->lpVtbl->InsertData(This,offset,data)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_DeleteData(This,offset,count) (This)->lpVtbl->DeleteData(This,offset,count)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_ReplaceData(This,offset,count,data) (This)->lpVtbl->ReplaceData(This,offset,count,data)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlCharacterData methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING *value) {
+    return This->lpVtbl->get_Data(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_put_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING value) {
+    return This->lpVtbl->put_Data(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Length(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 *value) {
+    return This->lpVtbl->get_Length(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_SubstringData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,UINT32 count,HSTRING *data) {
+    return This->lpVtbl->SubstringData(This,offset,count,data);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AppendData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING data) {
+    return This->lpVtbl->AppendData(This,data);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_InsertData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,HSTRING data) {
+    return This->lpVtbl->InsertData(This,offset,data);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_DeleteData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,UINT32 count) {
+    return This->lpVtbl->DeleteData(This,offset,count);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_ReplaceData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,UINT32 count,HSTRING data) {
+    return This->lpVtbl->ReplaceData(This,offset,count,data);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlCharacterData IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData
+#define IXmlCharacterDataVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl
+#define IXmlCharacterData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData
+#define IXmlCharacterData_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_QueryInterface
+#define IXmlCharacterData_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AddRef
+#define IXmlCharacterData_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_Release
+#define IXmlCharacterData_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetIids
+#define IXmlCharacterData_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetRuntimeClassName
+#define IXmlCharacterData_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetTrustLevel
+#define IXmlCharacterData_get_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Data
+#define IXmlCharacterData_put_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_put_Data
+#define IXmlCharacterData_get_Length __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Length
+#define IXmlCharacterData_SubstringData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_SubstringData
+#define IXmlCharacterData_AppendData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AppendData
+#define IXmlCharacterData_InsertData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_InsertData
+#define IXmlCharacterData_DeleteData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_DeleteData
+#define IXmlCharacterData_ReplaceData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_ReplaceData
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlComment interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlComment, 0xbca474d5, 0xb61f, 0x4611, 0x9c,0xac, 0x2e,0x92,0xe3,0x47,0x6d,0x47);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("bca474d5-b61f-4611-9cac-2e92e3476d47")
+                    IXmlComment : public IInspectable
+                    {
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment, 0xbca474d5, 0xb61f, 0x4611, 0x9c,0xac, 0x2e,0x92,0xe3,0x47,0x6d,0x47)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
+        TrustLevel *trustLevel);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlComment IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlComment
+#define IXmlCommentVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl
+#define IXmlComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment
+#define IXmlComment_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_QueryInterface
+#define IXmlComment_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_AddRef
+#define IXmlComment_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_Release
+#define IXmlComment_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetIids
+#define IXmlComment_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetRuntimeClassName
+#define IXmlComment_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetTrustLevel
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlDocument interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument, 0xf7f3a506, 0x1e87, 0x42d6, 0xbc,0xfb, 0xb8,0xc8,0x09,0xfa,0x54,0x94);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("f7f3a506-1e87-42d6-bcfb-b8c809fa5494")
+                    IXmlDocument : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_Doctype(
+                            ABI::Windows::Data::Xml::Dom::IXmlDocumentType **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_Implementation(
+                            ABI::Windows::Data::Xml::Dom::IXmlDomImplementation **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_DocumentElement(
+                            ABI::Windows::Data::Xml::Dom::IXmlElement **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateElement(
+                            HSTRING tag_name,
+                            ABI::Windows::Data::Xml::Dom::IXmlElement **new_element) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateDocumentFragment(
+                            ABI::Windows::Data::Xml::Dom::IXmlDocumentFragment **new_document_fragment) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateTextNode(
+                            HSTRING data,
+                            ABI::Windows::Data::Xml::Dom::IXmlText **new_text_node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateComment(
+                            HSTRING data,
+                            ABI::Windows::Data::Xml::Dom::IXmlComment **new_comment) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateProcessingInstruction(
+                            HSTRING target,
+                            HSTRING data,
+                            ABI::Windows::Data::Xml::Dom::IXmlProcessingInstruction **new_processing_instruction) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateAttribute(
+                            HSTRING name,
+                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **new_attribute) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateEntityReference(
+                            HSTRING name,
+                            ABI::Windows::Data::Xml::Dom::IXmlEntityReference **new_entity_reference) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE GetElementsByTagName(
+                            HSTRING tag_name,
+                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **elements) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateCDataSection(
+                            HSTRING data,
+                            ABI::Windows::Data::Xml::Dom::IXmlCDataSection **new_cdata_section) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_DocumentUri(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateAttributeNS(
+                            IInspectable *namespace_uri,
+                            HSTRING qualified_name,
+                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **new_attribute) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateElementNS(
+                            IInspectable *namespace_uri,
+                            HSTRING qualified_name,
+                            ABI::Windows::Data::Xml::Dom::IXmlElement **new_element) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE GetElementById(
+                            HSTRING element_id,
+                            ABI::Windows::Data::Xml::Dom::IXmlElement **element) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE ImportNode(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode *node,
+                            boolean deep,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **new_node) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument, 0xf7f3a506, 0x1e87, 0x42d6, 0xbc,0xfb, 0xb8,0xc8,0x09,0xfa,0x54,0x94)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlDocument methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Doctype)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Implementation)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_DocumentElement)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **value);
+
+    HRESULT (STDMETHODCALLTYPE *CreateElement)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING tag_name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDocumentFragment)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment **new_document_fragment);
+
+    HRESULT (STDMETHODCALLTYPE *CreateTextNode)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING data,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText **new_text_node);
+
+    HRESULT (STDMETHODCALLTYPE *CreateComment)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING data,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment **new_comment);
+
+    HRESULT (STDMETHODCALLTYPE *CreateProcessingInstruction)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING target,
+        HSTRING data,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction **new_processing_instruction);
+
+    HRESULT (STDMETHODCALLTYPE *CreateAttribute)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute);
+
+    HRESULT (STDMETHODCALLTYPE *CreateEntityReference)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference **new_entity_reference);
+
+    HRESULT (STDMETHODCALLTYPE *GetElementsByTagName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING tag_name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCDataSection)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING data,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection **new_cdata_section);
+
+    HRESULT (STDMETHODCALLTYPE *get_DocumentUri)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *CreateAttributeNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        IInspectable *namespace_uri,
+        HSTRING qualified_name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute);
+
+    HRESULT (STDMETHODCALLTYPE *CreateElementNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        IInspectable *namespace_uri,
+        HSTRING qualified_name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element);
+
+    HRESULT (STDMETHODCALLTYPE *GetElementById)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        HSTRING element_id,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **element);
+
+    HRESULT (STDMETHODCALLTYPE *ImportNode)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,
+        boolean deep,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlDocument methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Doctype(This,value) (This)->lpVtbl->get_Doctype(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Implementation(This,value) (This)->lpVtbl->get_Implementation(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentElement(This,value) (This)->lpVtbl->get_DocumentElement(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElement(This,tag_name,new_element) (This)->lpVtbl->CreateElement(This,tag_name,new_element)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateDocumentFragment(This,new_document_fragment) (This)->lpVtbl->CreateDocumentFragment(This,new_document_fragment)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateTextNode(This,data,new_text_node) (This)->lpVtbl->CreateTextNode(This,data,new_text_node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateComment(This,data,new_comment) (This)->lpVtbl->CreateComment(This,data,new_comment)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateProcessingInstruction(This,target,data,new_processing_instruction) (This)->lpVtbl->CreateProcessingInstruction(This,target,data,new_processing_instruction)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttribute(This,name,new_attribute) (This)->lpVtbl->CreateAttribute(This,name,new_attribute)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateEntityReference(This,name,new_entity_reference) (This)->lpVtbl->CreateEntityReference(This,name,new_entity_reference)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementsByTagName(This,tag_name,elements) (This)->lpVtbl->GetElementsByTagName(This,tag_name,elements)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateCDataSection(This,data,new_cdata_section) (This)->lpVtbl->CreateCDataSection(This,data,new_cdata_section)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentUri(This,value) (This)->lpVtbl->get_DocumentUri(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttributeNS(This,namespace_uri,qualified_name,new_attribute) (This)->lpVtbl->CreateAttributeNS(This,namespace_uri,qualified_name,new_attribute)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElementNS(This,namespace_uri,qualified_name,new_element) (This)->lpVtbl->CreateElementNS(This,namespace_uri,qualified_name,new_element)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementById(This,element_id,element) (This)->lpVtbl->GetElementById(This,element_id,element)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_ImportNode(This,node,deep,new_node) (This)->lpVtbl->ImportNode(This,node,deep,new_node)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlDocument methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Doctype(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType **value) {
+    return This->lpVtbl->get_Doctype(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Implementation(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation **value) {
+    return This->lpVtbl->get_Implementation(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentElement(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **value) {
+    return This->lpVtbl->get_DocumentElement(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElement(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING tag_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element) {
+    return This->lpVtbl->CreateElement(This,tag_name,new_element);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateDocumentFragment(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment **new_document_fragment) {
+    return This->lpVtbl->CreateDocumentFragment(This,new_document_fragment);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateTextNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlText **new_text_node) {
+    return This->lpVtbl->CreateTextNode(This,data,new_text_node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateComment(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment **new_comment) {
+    return This->lpVtbl->CreateComment(This,data,new_comment);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateProcessingInstruction(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING target,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction **new_processing_instruction) {
+    return This->lpVtbl->CreateProcessingInstruction(This,target,data,new_processing_instruction);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute) {
+    return This->lpVtbl->CreateAttribute(This,name,new_attribute);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateEntityReference(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference **new_entity_reference) {
+    return This->lpVtbl->CreateEntityReference(This,name,new_entity_reference);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementsByTagName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING tag_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements) {
+    return This->lpVtbl->GetElementsByTagName(This,tag_name,elements);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateCDataSection(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection **new_cdata_section) {
+    return This->lpVtbl->CreateCDataSection(This,data,new_cdata_section);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentUri(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING *value) {
+    return This->lpVtbl->get_DocumentUri(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,IInspectable *namespace_uri,HSTRING qualified_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute) {
+    return This->lpVtbl->CreateAttributeNS(This,namespace_uri,qualified_name,new_attribute);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElementNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,IInspectable *namespace_uri,HSTRING qualified_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element) {
+    return This->lpVtbl->CreateElementNS(This,namespace_uri,qualified_name,new_element);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementById(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING element_id,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **element) {
+    return This->lpVtbl->GetElementById(This,element_id,element);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_ImportNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,boolean deep,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node) {
+    return This->lpVtbl->ImportNode(This,node,deep,new_node);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlDocument IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument
+#define IXmlDocumentVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl
+#define IXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument
+#define IXmlDocument_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_QueryInterface
+#define IXmlDocument_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_AddRef
+#define IXmlDocument_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_Release
+#define IXmlDocument_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetIids
+#define IXmlDocument_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetRuntimeClassName
+#define IXmlDocument_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetTrustLevel
+#define IXmlDocument_get_Doctype __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Doctype
+#define IXmlDocument_get_Implementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Implementation
+#define IXmlDocument_get_DocumentElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentElement
+#define IXmlDocument_CreateElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElement
+#define IXmlDocument_CreateDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateDocumentFragment
+#define IXmlDocument_CreateTextNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateTextNode
+#define IXmlDocument_CreateComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateComment
+#define IXmlDocument_CreateProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateProcessingInstruction
+#define IXmlDocument_CreateAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttribute
+#define IXmlDocument_CreateEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateEntityReference
+#define IXmlDocument_GetElementsByTagName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementsByTagName
+#define IXmlDocument_CreateCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateCDataSection
+#define IXmlDocument_get_DocumentUri __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentUri
+#define IXmlDocument_CreateAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttributeNS
+#define IXmlDocument_CreateElementNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElementNS
+#define IXmlDocument_GetElementById __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementById
+#define IXmlDocument_ImportNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_ImportNode
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlDocumentFragment interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment, 0xe2ea6a96, 0x0c21, 0x44a5, 0x8b,0xc9, 0x9e,0x4a,0x26,0x27,0x08,0xec);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("e2ea6a96-0c21-44a5-8bc9-9e4a262708ec")
+                    IXmlDocumentFragment : public IInspectable
+                    {
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment, 0xe2ea6a96, 0x0c21, 0x44a5, 0x8b,0xc9, 0x9e,0x4a,0x26,0x27,0x08,0xec)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
+        TrustLevel *trustLevel);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlDocumentFragment IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment
+#define IXmlDocumentFragmentVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl
+#define IXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment
+#define IXmlDocumentFragment_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_QueryInterface
+#define IXmlDocumentFragment_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_AddRef
+#define IXmlDocumentFragment_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_Release
+#define IXmlDocumentFragment_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetIids
+#define IXmlDocumentFragment_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetRuntimeClassName
+#define IXmlDocumentFragment_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetTrustLevel
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlDocumentIO interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO, 0x6cd0e74e, 0xee65, 0x4489, 0x9e,0xbf, 0xca,0x43,0xe8,0x7b,0xa6,0x37);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("6cd0e74e-ee65-4489-9ebf-ca43e87ba637")
+                    IXmlDocumentIO : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE LoadXml(
+                            HSTRING xml) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE LoadXmlWithSettings(
+                            HSTRING xml,
+                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SaveToFileAsync(
+                            ABI::Windows::Storage::IStorageFile *file,
+                            ABI::Windows::Foundation::IAsyncAction **async_info) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO, 0x6cd0e74e, 0xee65, 0x4489, 0x9e,0xbf, 0xca,0x43,0xe8,0x7b,0xa6,0x37)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlDocumentIO methods ***/
+    HRESULT (STDMETHODCALLTYPE *LoadXml)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
+        HSTRING xml);
+
+    HRESULT (STDMETHODCALLTYPE *LoadXmlWithSettings)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
+        HSTRING xml,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings);
+
+    HRESULT (STDMETHODCALLTYPE *SaveToFileAsync)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
+        __x_ABI_CWindows_CStorage_CIStorageFile *file,
+        __x_ABI_CWindows_CFoundation_CIAsyncAction **async_info);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlDocumentIO methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXml(This,xml) (This)->lpVtbl->LoadXml(This,xml)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXmlWithSettings(This,xml,load_settings) (This)->lpVtbl->LoadXmlWithSettings(This,xml,load_settings)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_SaveToFileAsync(This,file,async_info) (This)->lpVtbl->SaveToFileAsync(This,file,async_info)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlDocumentIO methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXml(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,HSTRING xml) {
+    return This->lpVtbl->LoadXml(This,xml);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXmlWithSettings(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,HSTRING xml,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings) {
+    return This->lpVtbl->LoadXmlWithSettings(This,xml,load_settings);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_SaveToFileAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__x_ABI_CWindows_CFoundation_CIAsyncAction **async_info) {
+    return This->lpVtbl->SaveToFileAsync(This,file,async_info);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlDocumentIO IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO
+#define IXmlDocumentIOVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl
+#define IXmlDocumentIO __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO
+#define IXmlDocumentIO_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_QueryInterface
+#define IXmlDocumentIO_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_AddRef
+#define IXmlDocumentIO_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_Release
+#define IXmlDocumentIO_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetIids
+#define IXmlDocumentIO_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetRuntimeClassName
+#define IXmlDocumentIO_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetTrustLevel
+#define IXmlDocumentIO_LoadXml __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXml
+#define IXmlDocumentIO_LoadXmlWithSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXmlWithSettings
+#define IXmlDocumentIO_SaveToFileAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_SaveToFileAsync
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlDocumentIO2 interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2, 0x5d034661, 0x7bd8, 0x4ad5, 0x9e,0xbf, 0x81,0xe6,0x34,0x72,0x63,0xb1);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("5d034661-7bd8-4ad5-9ebf-81e6347263b1")
+                    IXmlDocumentIO2 : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE LoadXmlFromBuffer(
+                            ABI::Windows::Storage::Streams::IBuffer *buffer) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE LoadXmlFromBufferWithSettings(
+                            ABI::Windows::Storage::Streams::IBuffer *buffer,
+                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2, 0x5d034661, 0x7bd8, 0x4ad5, 0x9e,0xbf, 0x81,0xe6,0x34,0x72,0x63,0xb1)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlDocumentIO2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *LoadXmlFromBuffer)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer);
+
+    HRESULT (STDMETHODCALLTYPE *LoadXmlFromBufferWithSettings)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlDocumentIO2 methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBuffer(This,buffer) (This)->lpVtbl->LoadXmlFromBuffer(This,buffer)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBufferWithSettings(This,buffer,load_settings) (This)->lpVtbl->LoadXmlFromBufferWithSettings(This,buffer,load_settings)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlDocumentIO2 methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBuffer(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer) {
+    return This->lpVtbl->LoadXmlFromBuffer(This,buffer);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBufferWithSettings(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings) {
+    return This->lpVtbl->LoadXmlFromBufferWithSettings(This,buffer,load_settings);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlDocumentIO2 IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2
+#define IXmlDocumentIO2Vtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl
+#define IXmlDocumentIO2 __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2
+#define IXmlDocumentIO2_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_QueryInterface
+#define IXmlDocumentIO2_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_AddRef
+#define IXmlDocumentIO2_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_Release
+#define IXmlDocumentIO2_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetIids
+#define IXmlDocumentIO2_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetRuntimeClassName
+#define IXmlDocumentIO2_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetTrustLevel
+#define IXmlDocumentIO2_LoadXmlFromBuffer __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBuffer
+#define IXmlDocumentIO2_LoadXmlFromBufferWithSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBufferWithSettings
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlDocumentStatics interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics, 0x5543d254, 0xd757, 0x4b79, 0x95,0x39, 0x23,0x2b,0x18,0xf5,0x0b,0xf1);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("5543d254-d757-4b79-9539-232b18f50bf1")
+                    IXmlDocumentStatics : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE LoadFromUriAsync(
+                            ABI::Windows::Foundation::IUriRuntimeClass *uri,
+                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE LoadFromUriWithSettingsAsync(
+                            ABI::Windows::Foundation::IUriRuntimeClass *uri,
+                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings,
+                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE LoadFromFileAsync(
+                            ABI::Windows::Storage::IStorageFile *file,
+                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE LoadFromFileWithSettingsAsync(
+                            ABI::Windows::Storage::IStorageFile *file,
+                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings,
+                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics, 0x5543d254, 0xd757, 0x4b79, 0x95,0x39, 0x23,0x2b,0x18,0xf5,0x0b,0xf1)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlDocumentStatics methods ***/
+    HRESULT (STDMETHODCALLTYPE *LoadFromUriAsync)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
+        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);
+
+    HRESULT (STDMETHODCALLTYPE *LoadFromUriWithSettingsAsync)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
+        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);
+
+    HRESULT (STDMETHODCALLTYPE *LoadFromFileAsync)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
+        __x_ABI_CWindows_CStorage_CIStorageFile *file,
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);
+
+    HRESULT (STDMETHODCALLTYPE *LoadFromFileWithSettingsAsync)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
+        __x_ABI_CWindows_CStorage_CIStorageFile *file,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlDocumentStatics methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriAsync(This,uri,async_info) (This)->lpVtbl->LoadFromUriAsync(This,uri,async_info)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriWithSettingsAsync(This,uri,load_settings,async_info) (This)->lpVtbl->LoadFromUriWithSettingsAsync(This,uri,load_settings,async_info)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileAsync(This,file,async_info) (This)->lpVtbl->LoadFromFileAsync(This,file,async_info)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileWithSettingsAsync(This,file,load_settings,async_info) (This)->lpVtbl->LoadFromFileWithSettingsAsync(This,file,load_settings,async_info)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlDocumentStatics methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
+    return This->lpVtbl->LoadFromUriAsync(This,uri,async_info);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriWithSettingsAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
+    return This->lpVtbl->LoadFromUriWithSettingsAsync(This,uri,load_settings,async_info);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
+    return This->lpVtbl->LoadFromFileAsync(This,file,async_info);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileWithSettingsAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
+    return This->lpVtbl->LoadFromFileWithSettingsAsync(This,file,load_settings,async_info);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlDocumentStatics IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics
+#define IXmlDocumentStaticsVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl
+#define IXmlDocumentStatics __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics
+#define IXmlDocumentStatics_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_QueryInterface
+#define IXmlDocumentStatics_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_AddRef
+#define IXmlDocumentStatics_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_Release
+#define IXmlDocumentStatics_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetIids
+#define IXmlDocumentStatics_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetRuntimeClassName
+#define IXmlDocumentStatics_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetTrustLevel
+#define IXmlDocumentStatics_LoadFromUriAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriAsync
+#define IXmlDocumentStatics_LoadFromUriWithSettingsAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriWithSettingsAsync
+#define IXmlDocumentStatics_LoadFromFileAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileAsync
+#define IXmlDocumentStatics_LoadFromFileWithSettingsAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileWithSettingsAsync
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlDocumentType interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType, 0xf7342425, 0x9781, 0x4964, 0x8e,0x94, 0x9b,0x1c,0x6d,0xfc,0x9b,0xc7);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("f7342425-9781-4964-8e94-9b1c6dfc9bc7")
+                    IXmlDocumentType : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_Name(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_Entities(
+                            ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_Notations(
+                            ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap **value) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType, 0xf7342425, 0x9781, 0x4964, 0x8e,0x94, 0x9b,0x1c,0x6d,0xfc,0x9b,0xc7)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlDocumentType methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Name)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Entities)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Notations)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlDocumentType methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Entities(This,value) (This)->lpVtbl->get_Entities(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Notations(This,value) (This)->lpVtbl->get_Notations(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlDocumentType methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Name(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,HSTRING *value) {
+    return This->lpVtbl->get_Name(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Entities(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value) {
+    return This->lpVtbl->get_Entities(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Notations(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value) {
+    return This->lpVtbl->get_Notations(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlDocumentType IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType
+#define IXmlDocumentTypeVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl
+#define IXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType
+#define IXmlDocumentType_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_QueryInterface
+#define IXmlDocumentType_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_AddRef
+#define IXmlDocumentType_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_Release
+#define IXmlDocumentType_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetIids
+#define IXmlDocumentType_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetRuntimeClassName
+#define IXmlDocumentType_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetTrustLevel
+#define IXmlDocumentType_get_Name __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Name
+#define IXmlDocumentType_get_Entities __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Entities
+#define IXmlDocumentType_get_Notations __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Notations
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlDomImplementation interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation, 0x6de58132, 0xf11d, 0x4fbb, 0x8c,0xc6, 0x58,0x3c,0xba,0x93,0x11,0x2f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("6de58132-f11d-4fbb-8cc6-583cba93112f")
+                    IXmlDomImplementation : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE HasFeature(
+                            HSTRING feature,
+                            IInspectable *version,
+                            boolean *feature_supported) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation, 0x6de58132, 0xf11d, 0x4fbb, 0x8c,0xc6, 0x58,0x3c,0xba,0x93,0x11,0x2f)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlDomImplementation methods ***/
+    HRESULT (STDMETHODCALLTYPE *HasFeature)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
+        HSTRING feature,
+        IInspectable *version,
+        boolean *feature_supported);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlDomImplementation methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_HasFeature(This,feature,version,feature_supported) (This)->lpVtbl->HasFeature(This,feature,version,feature_supported)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlDomImplementation methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_HasFeature(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,HSTRING feature,IInspectable *version,boolean *feature_supported) {
+    return This->lpVtbl->HasFeature(This,feature,version,feature_supported);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlDomImplementation IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation
+#define IXmlDomImplementationVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl
+#define IXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation
+#define IXmlDomImplementation_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_QueryInterface
+#define IXmlDomImplementation_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_AddRef
+#define IXmlDomImplementation_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_Release
+#define IXmlDomImplementation_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetIids
+#define IXmlDomImplementation_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetRuntimeClassName
+#define IXmlDomImplementation_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetTrustLevel
+#define IXmlDomImplementation_HasFeature __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_HasFeature
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlElement interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlElement, 0x2dfb8a1f, 0x6b10, 0x4ef8, 0x9f,0x83, 0xef,0xcc,0xe8,0xfa,0xec,0x37);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("2dfb8a1f-6b10-4ef8-9f83-efcce8faec37")
+                    IXmlElement : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_TagName(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE GetAttribute(
+                            HSTRING attribute_name,
+                            HSTRING *attribute_value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SetAttribute(
+                            HSTRING attribute_name,
+                            HSTRING attribute_value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE RemoveAttribute(
+                            HSTRING attribute_name) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE GetAttributeNode(
+                            HSTRING attribute_name,
+                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **attribute_node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SetAttributeNode(
+                            ABI::Windows::Data::Xml::Dom::IXmlAttribute *new_attribute,
+                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **previous_attribute) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE RemoveAttributeNode(
+                            ABI::Windows::Data::Xml::Dom::IXmlAttribute *attribute_node,
+                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **removed_attribute) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE GetElementsByTagName(
+                            HSTRING tag_name,
+                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **elements) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SetAttributeNS(
+                            IInspectable *namespace_uri,
+                            HSTRING qualified_name,
+                            HSTRING value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE GetAttributeNS(
+                            IInspectable *namespace_uri,
+                            HSTRING local_name,
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE RemoveAttributeNS(
+                            IInspectable *namespace_uri,
+                            HSTRING local_name) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SetAttributeNodeNS(
+                            ABI::Windows::Data::Xml::Dom::IXmlAttribute *new_attribute,
+                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **previous_attribute) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE GetAttributeNodeNS(
+                            IInspectable *namespace_uri,
+                            HSTRING local_name,
+                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **previous_attribute) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement, 0x2dfb8a1f, 0x6b10, 0x4ef8, 0x9f,0x83, 0xef,0xcc,0xe8,0xfa,0xec,0x37)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlElement methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_TagName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *GetAttribute)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        HSTRING attribute_name,
+        HSTRING *attribute_value);
+
+    HRESULT (STDMETHODCALLTYPE *SetAttribute)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        HSTRING attribute_name,
+        HSTRING attribute_value);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveAttribute)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        HSTRING attribute_name);
+
+    HRESULT (STDMETHODCALLTYPE *GetAttributeNode)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        HSTRING attribute_name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **attribute_node);
+
+    HRESULT (STDMETHODCALLTYPE *SetAttributeNode)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveAttributeNode)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *attribute_node,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **removed_attribute);
+
+    HRESULT (STDMETHODCALLTYPE *GetElementsByTagName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        HSTRING tag_name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements);
+
+    HRESULT (STDMETHODCALLTYPE *SetAttributeNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        IInspectable *namespace_uri,
+        HSTRING qualified_name,
+        HSTRING value);
+
+    HRESULT (STDMETHODCALLTYPE *GetAttributeNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        IInspectable *namespace_uri,
+        HSTRING local_name,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveAttributeNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        IInspectable *namespace_uri,
+        HSTRING local_name);
+
+    HRESULT (STDMETHODCALLTYPE *SetAttributeNodeNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute);
+
+    HRESULT (STDMETHODCALLTYPE *GetAttributeNodeNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
+        IInspectable *namespace_uri,
+        HSTRING local_name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlElement methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_get_TagName(This,value) (This)->lpVtbl->get_TagName(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttribute(This,attribute_name,attribute_value) (This)->lpVtbl->GetAttribute(This,attribute_name,attribute_value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttribute(This,attribute_name,attribute_value) (This)->lpVtbl->SetAttribute(This,attribute_name,attribute_value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttribute(This,attribute_name) (This)->lpVtbl->RemoveAttribute(This,attribute_name)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNode(This,attribute_name,attribute_node) (This)->lpVtbl->GetAttributeNode(This,attribute_name,attribute_node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNode(This,new_attribute,previous_attribute) (This)->lpVtbl->SetAttributeNode(This,new_attribute,previous_attribute)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNode(This,attribute_node,removed_attribute) (This)->lpVtbl->RemoveAttributeNode(This,attribute_node,removed_attribute)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetElementsByTagName(This,tag_name,elements) (This)->lpVtbl->GetElementsByTagName(This,tag_name,elements)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNS(This,namespace_uri,qualified_name,value) (This)->lpVtbl->SetAttributeNS(This,namespace_uri,qualified_name,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNS(This,namespace_uri,local_name,value) (This)->lpVtbl->GetAttributeNS(This,namespace_uri,local_name,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNS(This,namespace_uri,local_name) (This)->lpVtbl->RemoveAttributeNS(This,namespace_uri,local_name)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNodeNS(This,new_attribute,previous_attribute) (This)->lpVtbl->SetAttributeNodeNS(This,new_attribute,previous_attribute)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNodeNS(This,namespace_uri,local_name,previous_attribute) (This)->lpVtbl->GetAttributeNodeNS(This,namespace_uri,local_name,previous_attribute)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlElement methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_get_TagName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING *value) {
+    return This->lpVtbl->get_TagName(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name,HSTRING *attribute_value) {
+    return This->lpVtbl->GetAttribute(This,attribute_name,attribute_value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name,HSTRING attribute_value) {
+    return This->lpVtbl->SetAttribute(This,attribute_name,attribute_value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name) {
+    return This->lpVtbl->RemoveAttribute(This,attribute_name);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **attribute_node) {
+    return This->lpVtbl->GetAttributeNode(This,attribute_name,attribute_node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute) {
+    return This->lpVtbl->SetAttributeNode(This,new_attribute,previous_attribute);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *attribute_node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **removed_attribute) {
+    return This->lpVtbl->RemoveAttributeNode(This,attribute_node,removed_attribute);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetElementsByTagName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING tag_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements) {
+    return This->lpVtbl->GetElementsByTagName(This,tag_name,elements);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING qualified_name,HSTRING value) {
+    return This->lpVtbl->SetAttributeNS(This,namespace_uri,qualified_name,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING local_name,HSTRING *value) {
+    return This->lpVtbl->GetAttributeNS(This,namespace_uri,local_name,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING local_name) {
+    return This->lpVtbl->RemoveAttributeNS(This,namespace_uri,local_name);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNodeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute) {
+    return This->lpVtbl->SetAttributeNodeNS(This,new_attribute,previous_attribute);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNodeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING local_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute) {
+    return This->lpVtbl->GetAttributeNodeNS(This,namespace_uri,local_name,previous_attribute);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlElement IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlElement
+#define IXmlElementVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl
+#define IXmlElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement
+#define IXmlElement_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_QueryInterface
+#define IXmlElement_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_AddRef
+#define IXmlElement_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_Release
+#define IXmlElement_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetIids
+#define IXmlElement_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetRuntimeClassName
+#define IXmlElement_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetTrustLevel
+#define IXmlElement_get_TagName __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_get_TagName
+#define IXmlElement_GetAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttribute
+#define IXmlElement_SetAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttribute
+#define IXmlElement_RemoveAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttribute
+#define IXmlElement_GetAttributeNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNode
+#define IXmlElement_SetAttributeNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNode
+#define IXmlElement_RemoveAttributeNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNode
+#define IXmlElement_GetElementsByTagName __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetElementsByTagName
+#define IXmlElement_SetAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNS
+#define IXmlElement_GetAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNS
+#define IXmlElement_RemoveAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNS
+#define IXmlElement_SetAttributeNodeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNodeNS
+#define IXmlElement_GetAttributeNodeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNodeNS
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlEntityReference interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference, 0x2e2f47bc, 0xc3d0, 0x4ccf, 0xbb,0x86, 0x0a,0xb8,0xc3,0x6a,0x61,0xcf);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("2e2f47bc-c3d0-4ccf-bb86-0ab8c36a61cf")
+                    IXmlEntityReference : public IInspectable
+                    {
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference, 0x2e2f47bc, 0xc3d0, 0x4ccf, 0xbb,0x86, 0x0a,0xb8,0xc3,0x6a,0x61,0xcf)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
+        TrustLevel *trustLevel);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlEntityReference IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference
+#define IXmlEntityReferenceVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl
+#define IXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference
+#define IXmlEntityReference_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_QueryInterface
+#define IXmlEntityReference_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_AddRef
+#define IXmlEntityReference_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_Release
+#define IXmlEntityReference_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetIids
+#define IXmlEntityReference_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetRuntimeClassName
+#define IXmlEntityReference_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetTrustLevel
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlLoadSettings interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings, 0x58aa07a8, 0xfed6, 0x46f7, 0xb4,0xc5, 0xfb,0x1b,0xa7,0x21,0x08,0xd6);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("58aa07a8-fed6-46f7-b4c5-fb1ba72108d6")
+                    IXmlLoadSettings : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_MaxElementDepth(
+                            UINT32 *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_MaxElementDepth(
+                            UINT32 value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_ProhibitDtd(
+                            boolean *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_ProhibitDtd(
+                            boolean value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_ResolveExternals(
+                            boolean *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_ResolveExternals(
+                            boolean value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_ValidateOnParse(
+                            boolean *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_ValidateOnParse(
+                            boolean value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_ElementContentWhiteSpace(
+                            boolean *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_ElementContentWhiteSpace(
+                            boolean value) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings, 0x58aa07a8, 0xfed6, 0x46f7, 0xb4,0xc5, 0xfb,0x1b,0xa7,0x21,0x08,0xd6)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlLoadSettings methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_MaxElementDepth)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        UINT32 *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_MaxElementDepth)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        UINT32 value);
+
+    HRESULT (STDMETHODCALLTYPE *get_ProhibitDtd)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_ProhibitDtd)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        boolean value);
+
+    HRESULT (STDMETHODCALLTYPE *get_ResolveExternals)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_ResolveExternals)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        boolean value);
+
+    HRESULT (STDMETHODCALLTYPE *get_ValidateOnParse)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_ValidateOnParse)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        boolean value);
+
+    HRESULT (STDMETHODCALLTYPE *get_ElementContentWhiteSpace)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_ElementContentWhiteSpace)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
+        boolean value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlLoadSettings methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_MaxElementDepth(This,value) (This)->lpVtbl->get_MaxElementDepth(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_MaxElementDepth(This,value) (This)->lpVtbl->put_MaxElementDepth(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ProhibitDtd(This,value) (This)->lpVtbl->get_ProhibitDtd(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ProhibitDtd(This,value) (This)->lpVtbl->put_ProhibitDtd(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ResolveExternals(This,value) (This)->lpVtbl->get_ResolveExternals(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ResolveExternals(This,value) (This)->lpVtbl->put_ResolveExternals(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ValidateOnParse(This,value) (This)->lpVtbl->get_ValidateOnParse(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ValidateOnParse(This,value) (This)->lpVtbl->put_ValidateOnParse(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ElementContentWhiteSpace(This,value) (This)->lpVtbl->get_ElementContentWhiteSpace(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ElementContentWhiteSpace(This,value) (This)->lpVtbl->put_ElementContentWhiteSpace(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlLoadSettings methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_MaxElementDepth(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,UINT32 *value) {
+    return This->lpVtbl->get_MaxElementDepth(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_MaxElementDepth(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,UINT32 value) {
+    return This->lpVtbl->put_MaxElementDepth(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ProhibitDtd(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
+    return This->lpVtbl->get_ProhibitDtd(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ProhibitDtd(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
+    return This->lpVtbl->put_ProhibitDtd(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ResolveExternals(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
+    return This->lpVtbl->get_ResolveExternals(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ResolveExternals(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
+    return This->lpVtbl->put_ResolveExternals(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ValidateOnParse(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
+    return This->lpVtbl->get_ValidateOnParse(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ValidateOnParse(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
+    return This->lpVtbl->put_ValidateOnParse(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ElementContentWhiteSpace(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
+    return This->lpVtbl->get_ElementContentWhiteSpace(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ElementContentWhiteSpace(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
+    return This->lpVtbl->put_ElementContentWhiteSpace(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlLoadSettings IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings
+#define IXmlLoadSettingsVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl
+#define IXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings
+#define IXmlLoadSettings_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_QueryInterface
+#define IXmlLoadSettings_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_AddRef
+#define IXmlLoadSettings_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_Release
+#define IXmlLoadSettings_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetIids
+#define IXmlLoadSettings_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetRuntimeClassName
+#define IXmlLoadSettings_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetTrustLevel
+#define IXmlLoadSettings_get_MaxElementDepth __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_MaxElementDepth
+#define IXmlLoadSettings_put_MaxElementDepth __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_MaxElementDepth
+#define IXmlLoadSettings_get_ProhibitDtd __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ProhibitDtd
+#define IXmlLoadSettings_put_ProhibitDtd __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ProhibitDtd
+#define IXmlLoadSettings_get_ResolveExternals __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ResolveExternals
+#define IXmlLoadSettings_put_ResolveExternals __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ResolveExternals
+#define IXmlLoadSettings_get_ValidateOnParse __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ValidateOnParse
+#define IXmlLoadSettings_put_ValidateOnParse __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ValidateOnParse
+#define IXmlLoadSettings_get_ElementContentWhiteSpace __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ElementContentWhiteSpace
+#define IXmlLoadSettings_put_ElementContentWhiteSpace __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ElementContentWhiteSpace
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlNamedNodeMap interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap, 0xb3a69eb0, 0xaab0, 0x4b82, 0xa6,0xfa, 0xb1,0x45,0x3f,0x7c,0x02,0x1b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("b3a69eb0-aab0-4b82-a6fa-b1453f7c021b")
+                    IXmlNamedNodeMap : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_Length(
+                            UINT32 *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE Item(
+                            UINT32 index,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE GetNamedItem(
+                            HSTRING name,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SetNamedItem(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode *node,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE RemoveNamedItem(
+                            HSTRING name,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE GetNamedItemNS(
+                            IInspectable *namespace_uri,
+                            HSTRING name,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE RemoveNamedItemNS(
+                            IInspectable *namespace_uri,
+                            HSTRING name,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SetNamedItemNS(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode *node,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap, 0xb3a69eb0, 0xaab0, 0x4b82, 0xa6,0xfa, 0xb1,0x45,0x3f,0x7c,0x02,0x1b)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlNamedNodeMap methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Length)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        UINT32 *value);
+
+    HRESULT (STDMETHODCALLTYPE *Item)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        UINT32 index,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);
+
+    HRESULT (STDMETHODCALLTYPE *GetNamedItem)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        HSTRING name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);
+
+    HRESULT (STDMETHODCALLTYPE *SetNamedItem)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveNamedItem)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        HSTRING name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);
+
+    HRESULT (STDMETHODCALLTYPE *GetNamedItemNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        IInspectable *namespace_uri,
+        HSTRING name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveNamedItemNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        IInspectable *namespace_uri,
+        HSTRING name,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);
+
+    HRESULT (STDMETHODCALLTYPE *SetNamedItemNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlNamedNodeMap methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Item(This,index,node) (This)->lpVtbl->Item(This,index,node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItem(This,name,node) (This)->lpVtbl->GetNamedItem(This,name,node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItem(This,node,previous_node) (This)->lpVtbl->SetNamedItem(This,node,previous_node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItem(This,name,previous_node) (This)->lpVtbl->RemoveNamedItem(This,name,previous_node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItemNS(This,namespace_uri,name,node) (This)->lpVtbl->GetNamedItemNS(This,namespace_uri,name,node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItemNS(This,namespace_uri,name,previous_node) (This)->lpVtbl->RemoveNamedItemNS(This,namespace_uri,name,previous_node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItemNS(This,node,previous_node) (This)->lpVtbl->SetNamedItemNS(This,node,previous_node)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlNamedNodeMap methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_get_Length(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,UINT32 *value) {
+    return This->lpVtbl->get_Length(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Item(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,UINT32 index,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
+    return This->lpVtbl->Item(This,index,node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItem(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
+    return This->lpVtbl->GetNamedItem(This,name,node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItem(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
+    return This->lpVtbl->SetNamedItem(This,node,previous_node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItem(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
+    return This->lpVtbl->RemoveNamedItem(This,name,previous_node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItemNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,IInspectable *namespace_uri,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
+    return This->lpVtbl->GetNamedItemNS(This,namespace_uri,name,node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItemNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,IInspectable *namespace_uri,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
+    return This->lpVtbl->RemoveNamedItemNS(This,namespace_uri,name,previous_node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItemNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
+    return This->lpVtbl->SetNamedItemNS(This,node,previous_node);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlNamedNodeMap IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap
+#define IXmlNamedNodeMapVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl
+#define IXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap
+#define IXmlNamedNodeMap_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_QueryInterface
+#define IXmlNamedNodeMap_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_AddRef
+#define IXmlNamedNodeMap_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Release
+#define IXmlNamedNodeMap_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetIids
+#define IXmlNamedNodeMap_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetRuntimeClassName
+#define IXmlNamedNodeMap_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetTrustLevel
+#define IXmlNamedNodeMap_get_Length __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_get_Length
+#define IXmlNamedNodeMap_Item __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Item
+#define IXmlNamedNodeMap_GetNamedItem __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItem
+#define IXmlNamedNodeMap_SetNamedItem __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItem
+#define IXmlNamedNodeMap_RemoveNamedItem __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItem
+#define IXmlNamedNodeMap_GetNamedItemNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItemNS
+#define IXmlNamedNodeMap_RemoveNamedItemNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItemNS
+#define IXmlNamedNodeMap_SetNamedItemNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItemNS
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlNode interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNode, 0x1c741d59, 0x2122, 0x47d5, 0xa8,0x56, 0x83,0xf3,0xd4,0x21,0x48,0x75);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("1c741d59-2122-47d5-a856-83f3d4214875")
+                    IXmlNode : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_NodeValue(
+                            IInspectable **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_NodeValue(
+                            IInspectable *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_NodeType(
+                            ABI::Windows::Data::Xml::Dom::NodeType *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_NodeName(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_ParentNode(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_ChildNodes(
+                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_FirstChild(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_LastChild(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_PreviousSibling(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_NextSibling(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_Attributes(
+                            ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE HasChildNodes(
+                            boolean *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_OwnerDocument(
+                            ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE InsertBefore(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode *new_child,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode *reference_child,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **inserted_child) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE ReplaceChild(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode *new_child,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode *reference_child,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_child) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE RemoveChild(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode *child_node,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **removed_child) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE AppendChild(
+                            ABI::Windows::Data::Xml::Dom::IXmlNode *new_child,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **appended_child) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CloneNode(
+                            boolean deep,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **new_node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_NamespaceUri(
+                            IInspectable **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_LocalName(
+                            IInspectable **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_Prefix(
+                            IInspectable **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE Normalize(
+                            ) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_Prefix(
+                            IInspectable *value) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode, 0x1c741d59, 0x2122, 0x47d5, 0xa8,0x56, 0x83,0xf3,0xd4,0x21,0x48,0x75)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlNode methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_NodeValue)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *put_NodeValue)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        IInspectable *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_NodeType)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CNodeType *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_NodeName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_ParentNode)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_ChildNodes)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_FirstChild)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_LastChild)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_PreviousSibling)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_NextSibling)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Attributes)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value);
+
+    HRESULT (STDMETHODCALLTYPE *HasChildNodes)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_OwnerDocument)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);
+
+    HRESULT (STDMETHODCALLTYPE *InsertBefore)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **inserted_child);
+
+    HRESULT (STDMETHODCALLTYPE *ReplaceChild)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_child);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveChild)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *child_node,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **removed_child);
+
+    HRESULT (STDMETHODCALLTYPE *AppendChild)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **appended_child);
+
+    HRESULT (STDMETHODCALLTYPE *CloneNode)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        boolean deep,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node);
+
+    HRESULT (STDMETHODCALLTYPE *get_NamespaceUri)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_LocalName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Prefix)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *Normalize)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This);
+
+    HRESULT (STDMETHODCALLTYPE *put_Prefix)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
+        IInspectable *value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlNode methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeValue(This,value) (This)->lpVtbl->get_NodeValue(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_NodeValue(This,value) (This)->lpVtbl->put_NodeValue(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeType(This,value) (This)->lpVtbl->get_NodeType(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeName(This,value) (This)->lpVtbl->get_NodeName(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ParentNode(This,value) (This)->lpVtbl->get_ParentNode(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ChildNodes(This,value) (This)->lpVtbl->get_ChildNodes(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_FirstChild(This,value) (This)->lpVtbl->get_FirstChild(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LastChild(This,value) (This)->lpVtbl->get_LastChild(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_PreviousSibling(This,value) (This)->lpVtbl->get_PreviousSibling(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NextSibling(This,value) (This)->lpVtbl->get_NextSibling(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Attributes(This,value) (This)->lpVtbl->get_Attributes(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_HasChildNodes(This,value) (This)->lpVtbl->HasChildNodes(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_OwnerDocument(This,value) (This)->lpVtbl->get_OwnerDocument(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_InsertBefore(This,new_child,reference_child,inserted_child) (This)->lpVtbl->InsertBefore(This,new_child,reference_child,inserted_child)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_ReplaceChild(This,new_child,reference_child,previous_child) (This)->lpVtbl->ReplaceChild(This,new_child,reference_child,previous_child)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_RemoveChild(This,child_node,removed_child) (This)->lpVtbl->RemoveChild(This,child_node,removed_child)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AppendChild(This,new_child,appended_child) (This)->lpVtbl->AppendChild(This,new_child,appended_child)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_CloneNode(This,deep,new_node) (This)->lpVtbl->CloneNode(This,deep,new_node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NamespaceUri(This,value) (This)->lpVtbl->get_NamespaceUri(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LocalName(This,value) (This)->lpVtbl->get_LocalName(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Prefix(This,value) (This)->lpVtbl->get_Prefix(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Normalize(This) (This)->lpVtbl->Normalize(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_Prefix(This,value) (This)->lpVtbl->put_Prefix(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlNode methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeValue(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
+    return This->lpVtbl->get_NodeValue(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_NodeValue(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable *value) {
+    return This->lpVtbl->put_NodeValue(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeType(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CNodeType *value) {
+    return This->lpVtbl->get_NodeType(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,HSTRING *value) {
+    return This->lpVtbl->get_NodeName(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ParentNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
+    return This->lpVtbl->get_ParentNode(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ChildNodes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **value) {
+    return This->lpVtbl->get_ChildNodes(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_FirstChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
+    return This->lpVtbl->get_FirstChild(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LastChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
+    return This->lpVtbl->get_LastChild(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_PreviousSibling(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
+    return This->lpVtbl->get_PreviousSibling(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NextSibling(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
+    return This->lpVtbl->get_NextSibling(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Attributes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value) {
+    return This->lpVtbl->get_Attributes(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_HasChildNodes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,boolean *value) {
+    return This->lpVtbl->HasChildNodes(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_OwnerDocument(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
+    return This->lpVtbl->get_OwnerDocument(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_InsertBefore(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **inserted_child) {
+    return This->lpVtbl->InsertBefore(This,new_child,reference_child,inserted_child);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_ReplaceChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_child) {
+    return This->lpVtbl->ReplaceChild(This,new_child,reference_child,previous_child);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_RemoveChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *child_node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **removed_child) {
+    return This->lpVtbl->RemoveChild(This,child_node,removed_child);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AppendChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **appended_child) {
+    return This->lpVtbl->AppendChild(This,new_child,appended_child);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_CloneNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,boolean deep,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node) {
+    return This->lpVtbl->CloneNode(This,deep,new_node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NamespaceUri(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
+    return This->lpVtbl->get_NamespaceUri(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LocalName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
+    return This->lpVtbl->get_LocalName(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Prefix(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
+    return This->lpVtbl->get_Prefix(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Normalize(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This) {
+    return This->lpVtbl->Normalize(This);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_Prefix(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable *value) {
+    return This->lpVtbl->put_Prefix(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlNode IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNode
+#define IXmlNodeVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl
+#define IXmlNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode
+#define IXmlNode_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_QueryInterface
+#define IXmlNode_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AddRef
+#define IXmlNode_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Release
+#define IXmlNode_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetIids
+#define IXmlNode_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetRuntimeClassName
+#define IXmlNode_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetTrustLevel
+#define IXmlNode_get_NodeValue __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeValue
+#define IXmlNode_put_NodeValue __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_NodeValue
+#define IXmlNode_get_NodeType __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeType
+#define IXmlNode_get_NodeName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeName
+#define IXmlNode_get_ParentNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ParentNode
+#define IXmlNode_get_ChildNodes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ChildNodes
+#define IXmlNode_get_FirstChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_FirstChild
+#define IXmlNode_get_LastChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LastChild
+#define IXmlNode_get_PreviousSibling __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_PreviousSibling
+#define IXmlNode_get_NextSibling __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NextSibling
+#define IXmlNode_get_Attributes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Attributes
+#define IXmlNode_HasChildNodes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_HasChildNodes
+#define IXmlNode_get_OwnerDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_OwnerDocument
+#define IXmlNode_InsertBefore __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_InsertBefore
+#define IXmlNode_ReplaceChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_ReplaceChild
+#define IXmlNode_RemoveChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_RemoveChild
+#define IXmlNode_AppendChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AppendChild
+#define IXmlNode_CloneNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_CloneNode
+#define IXmlNode_get_NamespaceUri __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NamespaceUri
+#define IXmlNode_get_LocalName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LocalName
+#define IXmlNode_get_Prefix __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Prefix
+#define IXmlNode_Normalize __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Normalize
+#define IXmlNode_put_Prefix __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_Prefix
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlNodeList interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList, 0x8c60ad77, 0x83a4, 0x4ec1, 0x9c,0x54, 0x7b,0xa4,0x29,0xe1,0x3d,0xa6);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("8c60ad77-83a4-4ec1-9c54-7ba429e13da6")
+                    IXmlNodeList : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_Length(
+                            UINT32 *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE Item(
+                            UINT32 index,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList, 0x8c60ad77, 0x83a4, 0x4ec1, 0x9c,0x54, 0x7b,0xa4,0x29,0xe1,0x3d,0xa6)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlNodeList methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Length)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
+        UINT32 *value);
+
+    HRESULT (STDMETHODCALLTYPE *Item)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
+        UINT32 index,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlNodeList methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Item(This,index,node) (This)->lpVtbl->Item(This,index,node)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlNodeList methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_get_Length(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,UINT32 *value) {
+    return This->lpVtbl->get_Length(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Item(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,UINT32 index,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
+    return This->lpVtbl->Item(This,index,node);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlNodeList IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList
+#define IXmlNodeListVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl
+#define IXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList
+#define IXmlNodeList_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_QueryInterface
+#define IXmlNodeList_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_AddRef
+#define IXmlNodeList_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Release
+#define IXmlNodeList_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetIids
+#define IXmlNodeList_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetRuntimeClassName
+#define IXmlNodeList_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetTrustLevel
+#define IXmlNodeList_get_Length __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_get_Length
+#define IXmlNodeList_Item __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Item
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlNodeSelector interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector, 0x63dbba8b, 0xd0db, 0x4fe1, 0xb7,0x45, 0xf9,0x43,0x3a,0xfd,0xc2,0x5b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("63dbba8b-d0db-4fe1-b745-f9433afdc25b")
+                    IXmlNodeSelector : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE SelectSingleNode(
+                            HSTRING xpath,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SelectNodes(
+                            HSTRING xpath,
+                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **node_list) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SelectSingleNodeNS(
+                            HSTRING xpath,
+                            IInspectable *namespaces,
+                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE SelectNodesNS(
+                            HSTRING xpath,
+                            IInspectable *namespaces,
+                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **node_list) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector, 0x63dbba8b, 0xd0db, 0x4fe1, 0xb7,0x45, 0xf9,0x43,0x3a,0xfd,0xc2,0x5b)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlNodeSelector methods ***/
+    HRESULT (STDMETHODCALLTYPE *SelectSingleNode)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
+        HSTRING xpath,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);
+
+    HRESULT (STDMETHODCALLTYPE *SelectNodes)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
+        HSTRING xpath,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list);
+
+    HRESULT (STDMETHODCALLTYPE *SelectSingleNodeNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
+        HSTRING xpath,
+        IInspectable *namespaces,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);
+
+    HRESULT (STDMETHODCALLTYPE *SelectNodesNS)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
+        HSTRING xpath,
+        IInspectable *namespaces,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlNodeSelector methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNode(This,xpath,node) (This)->lpVtbl->SelectSingleNode(This,xpath,node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodes(This,xpath,node_list) (This)->lpVtbl->SelectNodes(This,xpath,node_list)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNodeNS(This,xpath,namespaces,node) (This)->lpVtbl->SelectSingleNodeNS(This,xpath,namespaces,node)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodesNS(This,xpath,namespaces,node_list) (This)->lpVtbl->SelectNodesNS(This,xpath,namespaces,node_list)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlNodeSelector methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
+    return This->lpVtbl->SelectSingleNode(This,xpath,node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list) {
+    return This->lpVtbl->SelectNodes(This,xpath,node_list);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNodeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,IInspectable *namespaces,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
+    return This->lpVtbl->SelectSingleNodeNS(This,xpath,namespaces,node);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodesNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,IInspectable *namespaces,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list) {
+    return This->lpVtbl->SelectNodesNS(This,xpath,namespaces,node_list);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlNodeSelector IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector
+#define IXmlNodeSelectorVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl
+#define IXmlNodeSelector __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector
+#define IXmlNodeSelector_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_QueryInterface
+#define IXmlNodeSelector_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_AddRef
+#define IXmlNodeSelector_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_Release
+#define IXmlNodeSelector_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetIids
+#define IXmlNodeSelector_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetRuntimeClassName
+#define IXmlNodeSelector_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetTrustLevel
+#define IXmlNodeSelector_SelectSingleNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNode
+#define IXmlNodeSelector_SelectNodes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodes
+#define IXmlNodeSelector_SelectSingleNodeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNodeNS
+#define IXmlNodeSelector_SelectNodesNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodesNS
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlNodeSerializer interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer, 0x5cc5b382, 0xe6dd, 0x4991, 0xab,0xef, 0x06,0xd8,0xd2,0xe7,0xbd,0x0c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("5cc5b382-e6dd-4991-abef-06d8d2e7bd0c")
+                    IXmlNodeSerializer : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE GetXml(
+                            HSTRING *outer_xml) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_InnerText(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_InnerText(
+                            HSTRING value) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer, 0x5cc5b382, 0xe6dd, 0x4991, 0xab,0xef, 0x06,0xd8,0xd2,0xe7,0xbd,0x0c)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlNodeSerializer methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetXml)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
+        HSTRING *outer_xml);
+
+    HRESULT (STDMETHODCALLTYPE *get_InnerText)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_InnerText)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
+        HSTRING value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlNodeSerializer methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetXml(This,outer_xml) (This)->lpVtbl->GetXml(This,outer_xml)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_get_InnerText(This,value) (This)->lpVtbl->get_InnerText(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_put_InnerText(This,value) (This)->lpVtbl->put_InnerText(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlNodeSerializer methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetXml(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING *outer_xml) {
+    return This->lpVtbl->GetXml(This,outer_xml);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_get_InnerText(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING *value) {
+    return This->lpVtbl->get_InnerText(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_put_InnerText(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING value) {
+    return This->lpVtbl->put_InnerText(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlNodeSerializer IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer
+#define IXmlNodeSerializerVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl
+#define IXmlNodeSerializer __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer
+#define IXmlNodeSerializer_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_QueryInterface
+#define IXmlNodeSerializer_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_AddRef
+#define IXmlNodeSerializer_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_Release
+#define IXmlNodeSerializer_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetIids
+#define IXmlNodeSerializer_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetRuntimeClassName
+#define IXmlNodeSerializer_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetTrustLevel
+#define IXmlNodeSerializer_GetXml __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetXml
+#define IXmlNodeSerializer_get_InnerText __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_get_InnerText
+#define IXmlNodeSerializer_put_InnerText __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_put_InnerText
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlProcessingInstruction interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction, 0x2707fd1e, 0x1e92, 0x4ece, 0xb6,0xf4, 0x26,0xf0,0x69,0x07,0x8d,0xdc);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("2707fd1e-1e92-4ece-b6f4-26f069078ddc")
+                    IXmlProcessingInstruction : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_Target(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_Data(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_Data(
+                            HSTRING value) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction, 0x2707fd1e, 0x1e92, 0x4ece, 0xb6,0xf4, 0x26,0xf0,0x69,0x07,0x8d,0xdc)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlProcessingInstruction methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Target)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Data)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_Data)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
+        HSTRING value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlProcessingInstruction methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Target(This,value) (This)->lpVtbl->get_Target(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_put_Data(This,value) (This)->lpVtbl->put_Data(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlProcessingInstruction methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Target(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING *value) {
+    return This->lpVtbl->get_Target(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING *value) {
+    return This->lpVtbl->get_Data(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_put_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING value) {
+    return This->lpVtbl->put_Data(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlProcessingInstruction IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction
+#define IXmlProcessingInstructionVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl
+#define IXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction
+#define IXmlProcessingInstruction_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_QueryInterface
+#define IXmlProcessingInstruction_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_AddRef
+#define IXmlProcessingInstruction_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_Release
+#define IXmlProcessingInstruction_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetIids
+#define IXmlProcessingInstruction_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetRuntimeClassName
+#define IXmlProcessingInstruction_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetTrustLevel
+#define IXmlProcessingInstruction_get_Target __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Target
+#define IXmlProcessingInstruction_get_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Data
+#define IXmlProcessingInstruction_put_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_put_Data
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IXmlText interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlText, 0xf931a4cb, 0x308d, 0x4760, 0xa1,0xd5, 0x43,0xb6,0x74,0x50,0xac,0x7e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Data {
+            namespace Xml {
+                namespace Dom {
+                    MIDL_INTERFACE("f931a4cb-308d-4760-a1d5-43b67450ac7e")
+                    IXmlText : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE SplitText(
+                            UINT32 offset,
+                            ABI::Windows::Data::Xml::Dom::IXmlText **second_part) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText, 0xf931a4cb, 0x308d, 0x4760, 0xa1,0xd5, 0x43,0xb6,0x74,0x50,0xac,0x7e)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
+        TrustLevel *trustLevel);
+
+    /*** IXmlText methods ***/
+    HRESULT (STDMETHODCALLTYPE *SplitText)(
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
+        UINT32 offset,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText **second_part);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl;
+
+interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText {
+    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IXmlText methods ***/
+#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_SplitText(This,offset,second_part) (This)->lpVtbl->SplitText(This,offset,second_part)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IXmlText methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_SplitText(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,UINT32 offset,__x_ABI_CWindows_CData_CXml_CDom_CIXmlText **second_part) {
+    return This->lpVtbl->SplitText(This,offset,second_part);
+}
+#endif
+#ifdef WIDL_using_Windows_Data_Xml_Dom
+#define IID_IXmlText IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlText
+#define IXmlTextVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl
+#define IXmlText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText
+#define IXmlText_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_QueryInterface
+#define IXmlText_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_AddRef
+#define IXmlText_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_Release
+#define IXmlText_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetIids
+#define IXmlText_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetRuntimeClassName
+#define IXmlText_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetTrustLevel
+#define IXmlText_SplitText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_SplitText
+#endif /* WIDL_using_Windows_Data_Xml_Dom */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.DtdEntity
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_DtdEntity_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_DtdEntity_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdEntity[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','E','n','t','i','t','y',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdEntity[] = L"Windows.Data.Xml.Dom.DtdEntity";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdEntity[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','E','n','t','i','t','y',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_DtdEntity_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.DtdNotation
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_DtdNotation_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_DtdNotation_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdNotation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','N','o','t','a','t','i','o','n',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdNotation[] = L"Windows.Data.Xml.Dom.DtdNotation";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdNotation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','N','o','t','a','t','i','o','n',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_DtdNotation_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlAttribute
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlAttribute_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlAttribute_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlAttribute[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','A','t','t','r','i','b','u','t','e',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlAttribute[] = L"Windows.Data.Xml.Dom.XmlAttribute";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlAttribute[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','A','t','t','r','i','b','u','t','e',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlAttribute_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlCDataSection
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlCDataSection_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlCDataSection_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlCDataSection[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','D','a','t','a','S','e','c','t','i','o','n',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlCDataSection[] = L"Windows.Data.Xml.Dom.XmlCDataSection";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlCDataSection[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','D','a','t','a','S','e','c','t','i','o','n',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlCDataSection_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlComment
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlComment_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlComment_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlComment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','o','m','m','e','n','t',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlComment[] = L"Windows.Data.Xml.Dom.XmlComment";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlComment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','o','m','m','e','n','t',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlComment_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlDocument
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocument_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocument_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocument[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocument[] = L"Windows.Data.Xml.Dom.XmlDocument";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocument[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocument_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlDocumentFragment
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentFragment_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentFragment_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentFragment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','F','r','a','g','m','e','n','t',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentFragment[] = L"Windows.Data.Xml.Dom.XmlDocumentFragment";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentFragment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','F','r','a','g','m','e','n','t',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentFragment_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlDocumentType
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentType_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentType_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentType[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','T','y','p','e',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentType[] = L"Windows.Data.Xml.Dom.XmlDocumentType";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentType[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','T','y','p','e',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentType_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlDomImplementation
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDomImplementation_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDomImplementation_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDomImplementation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','m','I','m','p','l','e','m','e','n','t','a','t','i','o','n',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDomImplementation[] = L"Windows.Data.Xml.Dom.XmlDomImplementation";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDomImplementation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','m','I','m','p','l','e','m','e','n','t','a','t','i','o','n',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDomImplementation_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlElement
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlElement_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlElement_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlElement[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','l','e','m','e','n','t',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlElement[] = L"Windows.Data.Xml.Dom.XmlElement";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlElement[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','l','e','m','e','n','t',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlElement_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlEntityReference
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlEntityReference_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlEntityReference_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlEntityReference[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','n','t','i','t','y','R','e','f','e','r','e','n','c','e',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlEntityReference[] = L"Windows.Data.Xml.Dom.XmlEntityReference";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlEntityReference[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','n','t','i','t','y','R','e','f','e','r','e','n','c','e',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlEntityReference_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlLoadSettings
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlLoadSettings_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlLoadSettings_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlLoadSettings[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','L','o','a','d','S','e','t','t','i','n','g','s',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlLoadSettings[] = L"Windows.Data.Xml.Dom.XmlLoadSettings";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlLoadSettings[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','L','o','a','d','S','e','t','t','i','n','g','s',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlLoadSettings_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlNamedNodeMap
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNamedNodeMap_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNamedNodeMap_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNamedNodeMap[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','a','m','e','d','N','o','d','e','M','a','p',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNamedNodeMap[] = L"Windows.Data.Xml.Dom.XmlNamedNodeMap";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNamedNodeMap[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','a','m','e','d','N','o','d','e','M','a','p',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNamedNodeMap_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlNodeList
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNodeList_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNodeList_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNodeList[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','o','d','e','L','i','s','t',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNodeList[] = L"Windows.Data.Xml.Dom.XmlNodeList";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNodeList[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','o','d','e','L','i','s','t',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNodeList_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlProcessingInstruction
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlProcessingInstruction_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlProcessingInstruction_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlProcessingInstruction[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','P','r','o','c','e','s','s','i','n','g','I','n','s','t','r','u','c','t','i','o','n',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlProcessingInstruction[] = L"Windows.Data.Xml.Dom.XmlProcessingInstruction";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlProcessingInstruction[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','P','r','o','c','e','s','s','i','n','g','I','n','s','t','r','u','c','t','i','o','n',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlProcessingInstruction_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Data.Xml.Dom.XmlText
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlText_DEFINED
+#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlText_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlText[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','T','e','x','t',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlText[] = L"Windows.Data.Xml.Dom.XmlText";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlText[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','T','e','x','t',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlText_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > interface
+ */
+#ifndef ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
+#define ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode, 0xf1146ffc, 0x8c92, 0x56e8, 0x93,0xf1, 0x71,0x1f,0x86,0x72,0x26,0x33);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("f1146ffc-8c92-56e8-93f1-711f86722633")
+                IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > : IIterable_impl<ABI::Windows::Data::Xml::Dom::IXmlNode* >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode, 0xf1146ffc, 0x8c92, 0x56e8, 0x93,0xf1, 0x71,0x1f,0x86,0x72,0x26,0x33)
+#endif
+#else
+typedef struct __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        TrustLevel *trustLevel);
+
+    /*** IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *First)(
+        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode **value);
+
+    END_INTERFACE
+} __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl;
+
+interface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode {
+    CONST_VTBL __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
+#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_First(This,value) (This)->lpVtbl->First(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_Release(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
+static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_First(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode **value) {
+    return This->lpVtbl->First(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IIterable_IXmlNode IID___FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode
+#define IIterable_IXmlNodeVtbl __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl
+#define IIterable_IXmlNode __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode
+#define IIterable_IXmlNode_QueryInterface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface
+#define IIterable_IXmlNode_AddRef __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef
+#define IIterable_IXmlNode_Release __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_Release
+#define IIterable_IXmlNode_GetIids __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids
+#define IIterable_IXmlNode_GetRuntimeClassName __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName
+#define IIterable_IXmlNode_GetTrustLevel __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel
+#define IIterable_IXmlNode_First __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_First
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > interface
+ */
+#ifndef ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
+#define ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode, 0x3833a35e, 0x2c61, 0x56bd, 0xb0,0x93, 0x36,0x94,0x16,0x5f,0x88,0x98);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("3833a35e-2c61-56bd-b093-3694165f8898")
+                IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > : IIterator_impl<ABI::Windows::Data::Xml::Dom::IXmlNode* >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode, 0x3833a35e, 0x2c61, 0x56bd, 0xb0,0x93, 0x36,0x94,0x16,0x5f,0x88,0x98)
+#endif
+#else
+typedef struct __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        TrustLevel *trustLevel);
+
+    /*** IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Current)(
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *MoveNext)(
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *GetMany)(
+        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        UINT32 items_size,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,
+        UINT32 *value);
+
+    END_INTERFACE
+} __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl;
+
+interface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode {
+    CONST_VTBL __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
+#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_Release(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
+static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_Current(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
+    return This->lpVtbl->get_Current(This,value);
+}
+static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_HasCurrent(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,boolean *value) {
+    return This->lpVtbl->get_HasCurrent(This,value);
+}
+static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_MoveNext(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,boolean *value) {
+    return This->lpVtbl->MoveNext(This,value);
+}
+static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 items_size,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,UINT32 *value) {
+    return This->lpVtbl->GetMany(This,items_size,items,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IIterator_IXmlNode IID___FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode
+#define IIterator_IXmlNodeVtbl __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl
+#define IIterator_IXmlNode __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode
+#define IIterator_IXmlNode_QueryInterface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface
+#define IIterator_IXmlNode_AddRef __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef
+#define IIterator_IXmlNode_Release __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_Release
+#define IIterator_IXmlNode_GetIids __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids
+#define IIterator_IXmlNode_GetRuntimeClassName __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName
+#define IIterator_IXmlNode_GetTrustLevel __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel
+#define IIterator_IXmlNode_get_Current __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_Current
+#define IIterator_IXmlNode_get_HasCurrent __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_HasCurrent
+#define IIterator_IXmlNode_MoveNext __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_MoveNext
+#define IIterator_IXmlNode_GetMany __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > interface
+ */
+#ifndef ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
+#define ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode, 0x139d959e, 0xe7b5, 0x5cb6, 0xa5,0x96, 0x4b,0x54,0x44,0x78,0xda,0x9b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("139d959e-e7b5-5cb6-a596-4b544478da9b")
+                IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > : IVectorView_impl<ABI::Windows::Data::Xml::Dom::IXmlNode* >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode, 0x139d959e, 0xe7b5, 0x5cb6, 0xa5,0x96, 0x4b,0x54,0x44,0x78,0xda,0x9b)
+#endif
+#else
+typedef struct __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        TrustLevel *trustLevel);
+
+    /*** IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetAt)(
+        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        UINT32 index,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Size)(
+        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        UINT32 *value);
+
+    HRESULT (STDMETHODCALLTYPE *IndexOf)(
+        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *element,
+        UINT32 *index,
+        BOOLEAN *value);
+
+    HRESULT (STDMETHODCALLTYPE *GetMany)(
+        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
+        UINT32 start_index,
+        UINT32 items_size,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,
+        UINT32 *value);
+
+    END_INTERFACE
+} __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl;
+
+interface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode {
+    CONST_VTBL __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
+#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_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__CData__CXml__CDom__CIXmlNode_QueryInterface(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_Release(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
+static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetAt(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 index,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
+    return This->lpVtbl->GetAt(This,index,value);
+}
+static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_get_Size(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 *value) {
+    return This->lpVtbl->get_Size(This,value);
+}
+static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_IndexOf(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *element,UINT32 *index,BOOLEAN *value) {
+    return This->lpVtbl->IndexOf(This,element,index,value);
+}
+static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,UINT32 *value) {
+    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IVectorView_IXmlNode IID___FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode
+#define IVectorView_IXmlNodeVtbl __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl
+#define IVectorView_IXmlNode __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode
+#define IVectorView_IXmlNode_QueryInterface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface
+#define IVectorView_IXmlNode_AddRef __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef
+#define IVectorView_IXmlNode_Release __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_Release
+#define IVectorView_IXmlNode_GetIids __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids
+#define IVectorView_IXmlNode_GetRuntimeClassName __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName
+#define IVectorView_IXmlNode_GetTrustLevel __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel
+#define IVectorView_IXmlNode_GetAt __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetAt
+#define IVectorView_IXmlNode_get_Size __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_get_Size
+#define IVectorView_IXmlNode_IndexOf __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_IndexOf
+#define IVectorView_IXmlNode_GetMany __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > interface
+ */
+#ifndef ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument, 0xf858e239, 0x1896, 0x5982, 0x84,0x95, 0x14,0x31,0x68,0x47,0x8e,0xb8);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("f858e239-1896-5982-8495-143168478eb8")
+            IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Data::Xml::Dom::XmlDocument*, ABI::Windows::Data::Xml::Dom::IXmlDocument* > >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument, 0xf858e239, 0x1896, 0x5982, 0x84,0x95, 0x14,0x31,0x68,0x47,0x8e,0xb8)
+#endif
+#else
+typedef struct __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
+        TrustLevel *trustLevel);
+
+    /*** IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *put_Completed)(
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
+        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *handler);
+
+    HRESULT (STDMETHODCALLTYPE *get_Completed)(
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
+        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument **handler);
+
+    HRESULT (STDMETHODCALLTYPE *GetResults)(
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
+        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **results);
+
+    END_INTERFACE
+} __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl;
+
+interface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument {
+    CONST_VTBL __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_Release(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetIids(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetTrustLevel(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_put_Completed(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *handler) {
+    return This->lpVtbl->put_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_get_Completed(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument **handler) {
+    return This->lpVtbl->get_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetResults(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **results) {
+    return This->lpVtbl->GetResults(This,results);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperation_XmlDocument IID___FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument
+#define IAsyncOperation_XmlDocumentVtbl __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl
+#define IAsyncOperation_XmlDocument __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument
+#define IAsyncOperation_XmlDocument_QueryInterface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface
+#define IAsyncOperation_XmlDocument_AddRef __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef
+#define IAsyncOperation_XmlDocument_Release __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_Release
+#define IAsyncOperation_XmlDocument_GetIids __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetIids
+#define IAsyncOperation_XmlDocument_GetRuntimeClassName __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetRuntimeClassName
+#define IAsyncOperation_XmlDocument_GetTrustLevel __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetTrustLevel
+#define IAsyncOperation_XmlDocument_put_Completed __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_put_Completed
+#define IAsyncOperation_XmlDocument_get_Completed __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_get_Completed
+#define IAsyncOperation_XmlDocument_GetResults __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetResults
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > interface
+ */
+#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument, 0x5eef7817, 0x93dd, 0x5c0b, 0x9e,0x5a, 0xeb,0x49,0x04,0x08,0xf3,0xa9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("5eef7817-93dd-5c0b-9e5a-eb490408f3a9")
+            IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Data::Xml::Dom::XmlDocument*, ABI::Windows::Data::Xml::Dom::IXmlDocument* > >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument, 0x5eef7817, 0x93dd, 0x5c0b, 0x9e,0x5a, 0xeb,0x49,0x04,0x08,0xf3,0xa9)
+#endif
+#else
+typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This);
+
+    /*** IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This,
+        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *info,
+        AsyncStatus status);
+
+    END_INTERFACE
+} __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl;
+
+interface __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument {
+    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Release(This) (This)->lpVtbl->Release(This)
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
+#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Release(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *info,AsyncStatus status) {
+    return This->lpVtbl->Invoke(This,info,status);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperationCompletedHandler_XmlDocument IID___FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument
+#define IAsyncOperationCompletedHandler_XmlDocumentVtbl __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl
+#define IAsyncOperationCompletedHandler_XmlDocument __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument
+#define IAsyncOperationCompletedHandler_XmlDocument_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface
+#define IAsyncOperationCompletedHandler_XmlDocument_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef
+#define IAsyncOperationCompletedHandler_XmlDocument_Release __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Release
+#define IAsyncOperationCompletedHandler_XmlDocument_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_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_data_xml_dom_h__ */
diff --git a/mingw-w64-headers/include/windows.data.xml.dom.idl b/mingw-w64-headers/include/windows.data.xml.dom.idl
new file mode 100644
index 0000000..52e4b4d
--- /dev/null
+++ b/mingw-w64-headers/include/windows.data.xml.dom.idl
@@ -0,0 +1,675 @@
+/*
+ * Copyright (C) 2024 Biswapriyo Nath
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+import "inspectable.idl";
+import "asyncinfo.idl";
+import "eventtoken.idl";
+import "windowscontracts.idl";
+import "windows.foundation.idl";
+import "windows.storage.idl";
+import "windows.storage.streams.idl";
+
+namespace Windows.Data.Xml.Dom {
+    typedef enum NodeType NodeType;
+
+    interface IDtdEntity;
+    interface IDtdNotation;
+    interface IXmlAttribute;
+    interface IXmlCDataSection;
+    interface IXmlCharacterData;
+    interface IXmlComment;
+    interface IXmlDocument;
+    interface IXmlDocumentFragment;
+    interface IXmlDocumentIO;
+    interface IXmlDocumentIO2;
+    interface IXmlDocumentStatics;
+    interface IXmlDocumentType;
+    interface IXmlDomImplementation;
+    interface IXmlElement;
+    interface IXmlEntityReference;
+    interface IXmlLoadSettings;
+    interface IXmlNamedNodeMap;
+    interface IXmlNode;
+    interface IXmlNodeList;
+    interface IXmlNodeSelector;
+    interface IXmlNodeSerializer;
+    interface IXmlProcessingInstruction;
+    interface IXmlText;
+
+    runtimeclass DtdEntity;
+    runtimeclass DtdNotation;
+    runtimeclass XmlAttribute;
+    runtimeclass XmlCDataSection;
+    runtimeclass XmlComment;
+    runtimeclass XmlDocument;
+    runtimeclass XmlDocumentFragment;
+    runtimeclass XmlDocumentType;
+    runtimeclass XmlDomImplementation;
+    runtimeclass XmlElement;
+    runtimeclass XmlEntityReference;
+    runtimeclass XmlLoadSettings;
+    runtimeclass XmlNamedNodeMap;
+    runtimeclass XmlNodeList;
+    runtimeclass XmlProcessingInstruction;
+    runtimeclass XmlText;
+
+    declare {
+        interface Windows.Foundation.Collections.IIterable<Windows.Data.Xml.Dom.IXmlNode *>;
+        interface Windows.Foundation.Collections.IIterator<Windows.Data.Xml.Dom.IXmlNode *>;
+        interface Windows.Foundation.Collections.IVectorView<Windows.Data.Xml.Dom.IXmlNode *>;
+        interface Windows.Foundation.IAsyncOperation<Windows.Data.Xml.Dom.XmlDocument *>;
+        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Data.Xml.Dom.XmlDocument *>;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum NodeType
+    {
+        Invalid                   = 0,
+        ElementNode               = 1,
+        AttributeNode             = 2,
+        TextNode                  = 3,
+        DataSectionNode           = 4,
+        EntityReferenceNode       = 5,
+        EntityNode                = 6,
+        ProcessingInstructionNode = 7,
+        CommentNode               = 8,
+        DocumentNode              = 9,
+        DocumentTypeNode          = 10,
+        DocumentFragmentNode      = 11,
+        NotationNode              = 12,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.DtdEntity),
+        uuid(6a0b5ffc-63b4-480f-9e6a-8a92816aade4)
+    ]
+    interface IDtdEntity : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+        [propget] HRESULT PublicId([out, retval] IInspectable **value);
+        [propget] HRESULT SystemId([out, retval] IInspectable **value);
+        [propget] HRESULT NotationName([out, retval] IInspectable **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.DtdNotation),
+        uuid(8cb4e04d-6d46-4edb-ab73-df83c51ad397)
+    ]
+    interface IDtdNotation : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+        [propget] HRESULT PublicId([out, retval] IInspectable **value);
+        [propget] HRESULT SystemId([out, retval] IInspectable **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlAttribute),
+        uuid(ac144aa4-b4f1-4db6-b206-8a22c308db0a)
+    ]
+    interface IXmlAttribute : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+        [propget] HRESULT Name([out, retval] HSTRING *value);
+        [propget] HRESULT Specified([out, retval] boolean *value);
+        [propget] HRESULT Value([out, retval] HSTRING *value);
+        [propput] HRESULT Value([in] HSTRING value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlCDataSection),
+        uuid(4d04b46f-c8bd-45b4-8899-0400d7c2c60f)
+    ]
+    interface IXmlCDataSection : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlText,
+                 Windows.Data.Xml.Dom.IXmlCharacterData,
+                 Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(132e42ab-4e36-4df6-b1c8-0ce62fd88b26)
+    ]
+    interface IXmlCharacterData : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+        [propget] HRESULT Data([out, retval] HSTRING *value);
+        [propput] HRESULT Data([in] HSTRING value);
+        [propget] HRESULT Length([out, retval] UINT32 *value);
+        HRESULT SubstringData([in] UINT32 offset, [in] UINT32 count, [out, retval] HSTRING *data);
+        HRESULT AppendData([in] HSTRING data);
+        HRESULT InsertData([in] UINT32 offset, [in] HSTRING data);
+        HRESULT DeleteData([in] UINT32 offset, [in] UINT32 count);
+        HRESULT ReplaceData([in] UINT32 offset, [in] UINT32 count, [in] HSTRING data);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlComment),
+        uuid(bca474d5-b61f-4611-9cac-2e92e3476d47)
+    ]
+    interface IXmlComment : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlCharacterData,
+                 Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlDocument),
+        uuid(f7f3a506-1e87-42d6-bcfb-b8c809fa5494)
+    ]
+    interface IXmlDocument : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+        [propget] HRESULT Doctype([out, retval] Windows.Data.Xml.Dom.XmlDocumentType **value);
+        [propget] HRESULT Implementation([out, retval] Windows.Data.Xml.Dom.XmlDomImplementation **value);
+        [propget] HRESULT DocumentElement([out, retval] Windows.Data.Xml.Dom.XmlElement **value);
+        HRESULT CreateElement([in] HSTRING tag_name, [out, retval] Windows.Data.Xml.Dom.XmlElement **new_element);
+        HRESULT CreateDocumentFragment([out, retval] Windows.Data.Xml.Dom.XmlDocumentFragment **new_document_fragment);
+        HRESULT CreateTextNode([in] HSTRING data, [out, retval] Windows.Data.Xml.Dom.XmlText **new_text_node);
+        HRESULT CreateComment([in] HSTRING data, [out, retval] Windows.Data.Xml.Dom.XmlComment **new_comment);
+        HRESULT CreateProcessingInstruction([in] HSTRING target, [in] HSTRING data, [out, retval] Windows.Data.Xml.Dom.XmlProcessingInstruction **new_processing_instruction);
+        HRESULT CreateAttribute([in] HSTRING name, [out, retval] Windows.Data.Xml.Dom.XmlAttribute **new_attribute);
+        HRESULT CreateEntityReference([in] HSTRING name, [out, retval] Windows.Data.Xml.Dom.XmlEntityReference **new_entity_reference);
+        HRESULT GetElementsByTagName([in] HSTRING tag_name, [out, retval] Windows.Data.Xml.Dom.XmlNodeList **elements);
+        HRESULT CreateCDataSection([in] HSTRING data, [out, retval] Windows.Data.Xml.Dom.XmlCDataSection **new_cdata_section);
+        [propget] HRESULT DocumentUri([out, retval] HSTRING *value);
+        HRESULT CreateAttributeNS([in] IInspectable *namespace_uri, [in] HSTRING qualified_name, [out, retval] Windows.Data.Xml.Dom.XmlAttribute **new_attribute);
+        HRESULT CreateElementNS([in] IInspectable *namespace_uri, [in] HSTRING qualified_name, [out, retval] Windows.Data.Xml.Dom.XmlElement **new_element);
+        HRESULT GetElementById([in] HSTRING element_id, [out, retval] Windows.Data.Xml.Dom.XmlElement **element);
+        HRESULT ImportNode([in] Windows.Data.Xml.Dom.IXmlNode *node, [in] boolean deep, [out, retval] Windows.Data.Xml.Dom.IXmlNode **new_node);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlDocumentFragment),
+        uuid(e2ea6a96-0c21-44a5-8bc9-9e4a262708ec)
+    ]
+    interface IXmlDocumentFragment : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlDocument),
+        uuid(6cd0e74e-ee65-4489-9ebf-ca43e87ba637)
+    ]
+    interface IXmlDocumentIO : IInspectable
+    {
+        [overload("LoadXml")] HRESULT LoadXml([in] HSTRING xml);
+        [overload("LoadXml")] HRESULT LoadXmlWithSettings([in] HSTRING xml, [in] Windows.Data.Xml.Dom.XmlLoadSettings *load_settings);
+        HRESULT SaveToFileAsync([in] Windows.Storage.IStorageFile *file, [out, retval] Windows.Foundation.IAsyncAction **async_info);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlDocument),
+        uuid(5d034661-7bd8-4ad5-9ebf-81e6347263b1)
+    ]
+    interface IXmlDocumentIO2 : IInspectable
+    {
+        [overload("LoadXmlFromBuffer")] HRESULT LoadXmlFromBuffer(
+            [in] Windows.Storage.Streams.IBuffer *buffer);
+        [overload("LoadXmlFromBuffer")] HRESULT LoadXmlFromBufferWithSettings(
+            [in] Windows.Storage.Streams.IBuffer *buffer,
+            [in] Windows.Data.Xml.Dom.XmlLoadSettings *load_settings);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlDocument),
+        uuid(5543d254-d757-4b79-9539-232b18f50bf1)
+    ]
+    interface IXmlDocumentStatics : IInspectable
+    {
+        [overload("LoadFromUriAsync")] HRESULT LoadFromUriAsync(
+            [in] Windows.Foundation.Uri *uri,
+            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Data.Xml.Dom.XmlDocument *> **async_info);
+        [overload("LoadFromUriAsync")] HRESULT LoadFromUriWithSettingsAsync(
+            [in] Windows.Foundation.Uri *uri,
+            [in] Windows.Data.Xml.Dom.XmlLoadSettings *load_settings,
+            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Data.Xml.Dom.XmlDocument *> **async_info);
+        [overload("LoadFromFileAsync")] HRESULT LoadFromFileAsync(
+            [in] Windows.Storage.IStorageFile *file,
+            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Data.Xml.Dom.XmlDocument *> **async_info);
+        [overload("LoadFromFileAsync")] HRESULT LoadFromFileWithSettingsAsync(
+            [in] Windows.Storage.IStorageFile *file,
+            [in] Windows.Data.Xml.Dom.XmlLoadSettings *load_settings,
+            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Data.Xml.Dom.XmlDocument *> **async_info);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlDocumentType),
+        uuid(f7342425-9781-4964-8e94-9b1c6dfc9bc7)
+    ]
+    interface IXmlDocumentType : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+        [propget] HRESULT Name([out, retval] HSTRING *value);
+        [propget] HRESULT Entities([out, retval] Windows.Data.Xml.Dom.XmlNamedNodeMap **value);
+        [propget] HRESULT Notations([out, retval] Windows.Data.Xml.Dom.XmlNamedNodeMap **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlDomImplementation),
+        uuid(6de58132-f11d-4fbb-8cc6-583cba93112f)
+    ]
+    interface IXmlDomImplementation : IInspectable
+    {
+        HRESULT HasFeature([in] HSTRING feature, [in] IInspectable *version, [out, retval] boolean *feature_supported);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlElement),
+        uuid(2dfb8a1f-6b10-4ef8-9f83-efcce8faec37)
+    ]
+    interface IXmlElement : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+        [propget] HRESULT TagName([out, retval] HSTRING *value);
+        HRESULT GetAttribute([in] HSTRING attribute_name, [out, retval] HSTRING *attribute_value);
+        HRESULT SetAttribute([in] HSTRING attribute_name, [in] HSTRING attribute_value);
+        HRESULT RemoveAttribute([in] HSTRING attribute_name);
+        HRESULT GetAttributeNode([in] HSTRING attribute_name, [out, retval] Windows.Data.Xml.Dom.XmlAttribute **attribute_node);
+        HRESULT SetAttributeNode([in] Windows.Data.Xml.Dom.XmlAttribute *new_attribute, [out, retval] Windows.Data.Xml.Dom.XmlAttribute **previous_attribute);
+        HRESULT RemoveAttributeNode([in] Windows.Data.Xml.Dom.XmlAttribute *attribute_node, [out, retval] Windows.Data.Xml.Dom.XmlAttribute **removed_attribute);
+        HRESULT GetElementsByTagName([in] HSTRING tag_name, [out, retval] Windows.Data.Xml.Dom.XmlNodeList **elements);
+        HRESULT SetAttributeNS([in] IInspectable *namespace_uri, [in] HSTRING qualified_name, [in] HSTRING value);
+        HRESULT GetAttributeNS([in] IInspectable *namespace_uri, [in] HSTRING local_name, [out, retval] HSTRING *value);
+        HRESULT RemoveAttributeNS([in] IInspectable *namespace_uri, [in] HSTRING local_name);
+        HRESULT SetAttributeNodeNS([in] Windows.Data.Xml.Dom.XmlAttribute *new_attribute, [out, retval] Windows.Data.Xml.Dom.XmlAttribute **previous_attribute);
+        HRESULT GetAttributeNodeNS([in] IInspectable *namespace_uri, [in] HSTRING local_name, [out, retval] Windows.Data.Xml.Dom.XmlAttribute **previous_attribute);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlEntityReference),
+        uuid(2e2f47bc-c3d0-4ccf-bb86-0ab8c36a61cf)
+    ]
+    interface IXmlEntityReference : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlLoadSettings),
+        uuid(58aa07a8-fed6-46f7-b4c5-fb1ba72108d6)
+    ]
+    interface IXmlLoadSettings : IInspectable
+    {
+        [propget] HRESULT MaxElementDepth([out, retval] UINT32 *value);
+        [propput] HRESULT MaxElementDepth([in] UINT32 value);
+        [propget] HRESULT ProhibitDtd([out, retval] boolean *value);
+        [propput] HRESULT ProhibitDtd([in] boolean value);
+        [propget] HRESULT ResolveExternals([out, retval] boolean *value);
+        [propput] HRESULT ResolveExternals([in] boolean value);
+        [propget] HRESULT ValidateOnParse([out, retval] boolean *value);
+        [propput] HRESULT ValidateOnParse([in] boolean value);
+        [propget] HRESULT ElementContentWhiteSpace([out, retval] boolean *value);
+        [propput] HRESULT ElementContentWhiteSpace([in] boolean value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlNamedNodeMap),
+        uuid(b3a69eb0-aab0-4b82-a6fa-b1453f7c021b)
+    ]
+    interface IXmlNamedNodeMap : IInspectable
+        requires Windows.Foundation.Collections.IVectorView<Windows.Data.Xml.Dom.IXmlNode *>,
+                 Windows.Foundation.Collections.IIterable<Windows.Data.Xml.Dom.IXmlNode *>
+    {
+        [propget] HRESULT Length([out, retval] UINT32 *value);
+        HRESULT Item([in] UINT32 index, [out, retval] Windows.Data.Xml.Dom.IXmlNode **node);
+        HRESULT GetNamedItem([in] HSTRING name, [out, retval] Windows.Data.Xml.Dom.IXmlNode **node);
+        HRESULT SetNamedItem([in] Windows.Data.Xml.Dom.IXmlNode *node, [out, retval] Windows.Data.Xml.Dom.IXmlNode **previous_node);
+        HRESULT RemoveNamedItem([in] HSTRING name, [out, retval] Windows.Data.Xml.Dom.IXmlNode **previous_node);
+        HRESULT GetNamedItemNS([in] IInspectable *namespace_uri, [in] HSTRING name, [out, retval] Windows.Data.Xml.Dom.IXmlNode **node);
+        HRESULT RemoveNamedItemNS([in] IInspectable *namespace_uri, [in] HSTRING name, [out, retval] Windows.Data.Xml.Dom.IXmlNode **previous_node);
+        HRESULT SetNamedItemNS([in] Windows.Data.Xml.Dom.IXmlNode *node, [out, retval] Windows.Data.Xml.Dom.IXmlNode **previous_node);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(1c741d59-2122-47d5-a856-83f3d4214875)
+    ]
+    interface IXmlNode : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+        [propget] HRESULT NodeValue([out, retval] IInspectable **value);
+        [propput] HRESULT NodeValue([in] IInspectable *value);
+        [propget] HRESULT NodeType([out, retval] Windows.Data.Xml.Dom.NodeType *value);
+        [propget] HRESULT NodeName([out, retval] HSTRING *value);
+        [propget] HRESULT ParentNode([out, retval] Windows.Data.Xml.Dom.IXmlNode **value);
+        [propget] HRESULT ChildNodes([out, retval] Windows.Data.Xml.Dom.XmlNodeList **value);
+        [propget] HRESULT FirstChild([out, retval] Windows.Data.Xml.Dom.IXmlNode **value);
+        [propget] HRESULT LastChild([out, retval] Windows.Data.Xml.Dom.IXmlNode **value);
+        [propget] HRESULT PreviousSibling([out, retval] Windows.Data.Xml.Dom.IXmlNode **value);
+        [propget] HRESULT NextSibling([out, retval] Windows.Data.Xml.Dom.IXmlNode **value);
+        [propget] HRESULT Attributes([out, retval] Windows.Data.Xml.Dom.XmlNamedNodeMap **value);
+        HRESULT HasChildNodes([out, retval] boolean *value);
+        [propget] HRESULT OwnerDocument([out, retval] Windows.Data.Xml.Dom.XmlDocument **value);
+        HRESULT InsertBefore([in] Windows.Data.Xml.Dom.IXmlNode *new_child, [in] Windows.Data.Xml.Dom.IXmlNode *reference_child, [out, retval] Windows.Data.Xml.Dom.IXmlNode **inserted_child);
+        HRESULT ReplaceChild([in] Windows.Data.Xml.Dom.IXmlNode *new_child, [in] Windows.Data.Xml.Dom.IXmlNode *reference_child, [out, retval] Windows.Data.Xml.Dom.IXmlNode **previous_child);
+        HRESULT RemoveChild([in] Windows.Data.Xml.Dom.IXmlNode *child_node, [out, retval] Windows.Data.Xml.Dom.IXmlNode **removed_child);
+        HRESULT AppendChild([in] Windows.Data.Xml.Dom.IXmlNode *new_child, [out, retval] Windows.Data.Xml.Dom.IXmlNode **appended_child);
+        HRESULT CloneNode([in] boolean deep, [out, retval] Windows.Data.Xml.Dom.IXmlNode **new_node);
+        [propget] HRESULT NamespaceUri([out, retval] IInspectable **value);
+        [propget] HRESULT LocalName([out, retval] IInspectable **value);
+        [propget] HRESULT Prefix([out, retval] IInspectable **value);
+        HRESULT Normalize();
+        [propput] HRESULT Prefix([in] IInspectable *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlNodeList),
+        uuid(8c60ad77-83a4-4ec1-9c54-7ba429e13da6)
+    ]
+    interface IXmlNodeList : IInspectable
+        requires Windows.Foundation.Collections.IVectorView<Windows.Data.Xml.Dom.IXmlNode *>,
+                 Windows.Foundation.Collections.IIterable<Windows.Data.Xml.Dom.IXmlNode *>
+    {
+        [propget] HRESULT Length([out, retval] UINT32 *value);
+        HRESULT Item([in] UINT32 index, [out, retval] Windows.Data.Xml.Dom.IXmlNode **node);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(63dbba8b-d0db-4fe1-b745-f9433afdc25b)
+    ]
+    interface IXmlNodeSelector : IInspectable
+    {
+        HRESULT SelectSingleNode([in] HSTRING xpath, [out, retval] Windows.Data.Xml.Dom.IXmlNode **node);
+        HRESULT SelectNodes([in] HSTRING xpath, [out, retval] Windows.Data.Xml.Dom.XmlNodeList **node_list);
+        HRESULT SelectSingleNodeNS([in] HSTRING xpath, [in] IInspectable *namespaces, [out, retval] Windows.Data.Xml.Dom.IXmlNode **node);
+        HRESULT SelectNodesNS([in] HSTRING xpath, [in] IInspectable *namespaces, [out, retval] Windows.Data.Xml.Dom.XmlNodeList **node_list);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(5cc5b382-e6dd-4991-abef-06d8d2e7bd0c)
+    ]
+    interface IXmlNodeSerializer : IInspectable
+    {
+        HRESULT GetXml([out, retval] HSTRING *outer_xml);
+        [propget] HRESULT InnerText([out, retval] HSTRING *value);
+        [propput] HRESULT InnerText([in] HSTRING value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Data.Xml.Dom.XmlProcessingInstruction),
+        uuid(2707fd1e-1e92-4ece-b6f4-26f069078ddc)
+    ]
+    interface IXmlProcessingInstruction : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+        [propget] HRESULT Target([out, retval] HSTRING *value);
+        [propget] HRESULT Data([out, retval] HSTRING *value);
+        [propput] HRESULT Data([in] HSTRING value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(f931a4cb-308d-4760-a1d5-43b67450ac7e)
+    ]
+    interface IXmlText : IInspectable
+        requires Windows.Data.Xml.Dom.IXmlCharacterData,
+                 Windows.Data.Xml.Dom.IXmlNode,
+                 Windows.Data.Xml.Dom.IXmlNodeSelector,
+                 Windows.Data.Xml.Dom.IXmlNodeSerializer
+    {
+        HRESULT SplitText([in] UINT32 offset, [out, retval] Windows.Data.Xml.Dom.IXmlText **second_part);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass DtdEntity
+    {
+        [default] interface Windows.Data.Xml.Dom.IDtdEntity;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass DtdNotation
+    {
+        [default] interface Windows.Data.Xml.Dom.IDtdNotation;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlAttribute
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlAttribute;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlCDataSection
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlCDataSection;
+        interface Windows.Data.Xml.Dom.IXmlText;
+        interface Windows.Data.Xml.Dom.IXmlCharacterData;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlComment
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlComment;
+        interface Windows.Data.Xml.Dom.IXmlCharacterData;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+
+    [
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        static(Windows.Data.Xml.Dom.IXmlDocumentStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        threading(both)
+    ]
+    runtimeclass XmlDocument
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlDocument;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+        interface Windows.Data.Xml.Dom.IXmlDocumentIO;
+        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Data.Xml.Dom.IXmlDocumentIO2;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlDocumentFragment
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlDocumentFragment;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlDocumentType
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlDocumentType;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlDomImplementation
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlDomImplementation;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlElement
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlElement;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlEntityReference
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlEntityReference;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+
+    [
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass XmlLoadSettings
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlLoadSettings;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlNamedNodeMap
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlNamedNodeMap;
+        interface Windows.Foundation.Collections.IVectorView<Windows.Data.Xml.Dom.IXmlNode *>;
+        interface Windows.Foundation.Collections.IIterable<Windows.Data.Xml.Dom.IXmlNode *>;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlNodeList
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlNodeList;
+        interface Windows.Foundation.Collections.IVectorView<Windows.Data.Xml.Dom.IXmlNode *>;
+        interface Windows.Foundation.Collections.IIterable<Windows.Data.Xml.Dom.IXmlNode *>;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlProcessingInstruction
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlProcessingInstruction;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass XmlText
+    {
+        [default] interface Windows.Data.Xml.Dom.IXmlText;
+        interface Windows.Data.Xml.Dom.IXmlCharacterData;
+        interface Windows.Data.Xml.Dom.IXmlNode;
+        interface Windows.Data.Xml.Dom.IXmlNodeSerializer;
+        interface Windows.Data.Xml.Dom.IXmlNodeSelector;
+    }
+}
diff --git a/mingw-w64-headers/include/windows.foundation.h b/mingw-w64-headers/include/windows.foundation.h
index 0b71a87..c5699b1 100644
--- a/mingw-w64-headers/include/windows.foundation.h
+++ b/mingw-w64-headers/include/windows.foundation.h
@@ -612,6 +612,22 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIAsyncOperationProgressHandler_2_UINT32_UINT32_FWD_DEFINED__
+#define ____FIAsyncOperationProgressHandler_2_UINT32_UINT32_FWD_DEFINED__
+typedef interface __FIAsyncOperationProgressHandler_2_UINT32_UINT32 __FIAsyncOperationProgressHandler_2_UINT32_UINT32;
+#ifdef __cplusplus
+#define __FIAsyncOperationProgressHandler_2_UINT32_UINT32 ABI::Windows::Foundation::IAsyncOperationProgressHandler<UINT32,UINT32 >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_FWD_DEFINED__
+#define ____FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_FWD_DEFINED__
+typedef interface __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32;
+#ifdef __cplusplus
+#define __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler<UINT32,UINT32 >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FIAsyncOperation_1_IInspectable_FWD_DEFINED__
 #define ____FIAsyncOperation_1_IInspectable_FWD_DEFINED__
 typedef interface __FIAsyncOperation_1_IInspectable __FIAsyncOperation_1_IInspectable;
@@ -636,6 +652,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIAsyncOperationWithProgress_2_UINT32_UINT32_FWD_DEFINED__
+#define ____FIAsyncOperationWithProgress_2_UINT32_UINT32_FWD_DEFINED__
+typedef interface __FIAsyncOperationWithProgress_2_UINT32_UINT32 __FIAsyncOperationWithProgress_2_UINT32_UINT32;
+#ifdef __cplusplus
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32 ABI::Windows::Foundation::IAsyncOperationWithProgress<UINT32,UINT32 >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FIReference_1_BYTE_FWD_DEFINED__
 #define ____FIReference_1_BYTE_FWD_DEFINED__
 typedef interface __FIReference_1_BYTE __FIReference_1_BYTE;
@@ -644,14 +668,6 @@
 #endif /* __cplusplus */
 #endif
 
-#ifndef ____FIReference_1_INT32_FWD_DEFINED__
-#define ____FIReference_1_INT32_FWD_DEFINED__
-typedef interface __FIReference_1_INT32 __FIReference_1_INT32;
-#ifdef __cplusplus
-#define __FIReference_1_INT32 ABI::Windows::Foundation::IReference<INT32 >
-#endif /* __cplusplus */
-#endif
-
 #ifndef ____FIReference_1_DOUBLE_FWD_DEFINED__
 #define ____FIReference_1_DOUBLE_FWD_DEFINED__
 typedef interface __FIReference_1_DOUBLE __FIReference_1_DOUBLE;
@@ -668,6 +684,38 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIReference_1_GUID_FWD_DEFINED__
+#define ____FIReference_1_GUID_FWD_DEFINED__
+typedef interface __FIReference_1_GUID __FIReference_1_GUID;
+#ifdef __cplusplus
+#define __FIReference_1_GUID ABI::Windows::Foundation::IReference<GUID >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_INT16_FWD_DEFINED__
+#define ____FIReference_1_INT16_FWD_DEFINED__
+typedef interface __FIReference_1_INT16 __FIReference_1_INT16;
+#ifdef __cplusplus
+#define __FIReference_1_INT16 ABI::Windows::Foundation::IReference<INT16 >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_INT32_FWD_DEFINED__
+#define ____FIReference_1_INT32_FWD_DEFINED__
+typedef interface __FIReference_1_INT32 __FIReference_1_INT32;
+#ifdef __cplusplus
+#define __FIReference_1_INT32 ABI::Windows::Foundation::IReference<INT32 >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_INT64_FWD_DEFINED__
+#define ____FIReference_1_INT64_FWD_DEFINED__
+typedef interface __FIReference_1_INT64 __FIReference_1_INT64;
+#ifdef __cplusplus
+#define __FIReference_1_INT64 ABI::Windows::Foundation::IReference<INT64 >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FIReference_1_UINT32_FWD_DEFINED__
 #define ____FIReference_1_UINT32_FWD_DEFINED__
 typedef interface __FIReference_1_UINT32 __FIReference_1_UINT32;
@@ -692,6 +740,46 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIReference_1_Point_FWD_DEFINED__
+#define ____FIReference_1_Point_FWD_DEFINED__
+typedef interface __FIReference_1_Point __FIReference_1_Point;
+#ifdef __cplusplus
+#define __FIReference_1_Point ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::Point >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_Rect_FWD_DEFINED__
+#define ____FIReference_1_Rect_FWD_DEFINED__
+typedef interface __FIReference_1_Rect __FIReference_1_Rect;
+#ifdef __cplusplus
+#define __FIReference_1_Rect ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::Rect >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_Size_FWD_DEFINED__
+#define ____FIReference_1_Size_FWD_DEFINED__
+typedef interface __FIReference_1_Size __FIReference_1_Size;
+#ifdef __cplusplus
+#define __FIReference_1_Size ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::Size >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_TimeSpan_FWD_DEFINED__
+#define ____FIReference_1_TimeSpan_FWD_DEFINED__
+typedef interface __FIReference_1_TimeSpan __FIReference_1_TimeSpan;
+#ifdef __cplusplus
+#define __FIReference_1_TimeSpan ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::TimeSpan >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_boolean_FWD_DEFINED__
+#define ____FIReference_1_boolean_FWD_DEFINED__
+typedef interface __FIReference_1_boolean __FIReference_1_boolean;
+#ifdef __cplusplus
+#define __FIReference_1_boolean ABI::Windows::Foundation::IReference<boolean >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FITypedEventHandler_2_IInspectable_IInspectable_FWD_DEFINED__
 #define ____FITypedEventHandler_2_IInspectable_IInspectable_FWD_DEFINED__
 typedef interface __FITypedEventHandler_2_IInspectable_IInspectable __FITypedEventHandler_2_IInspectable_IInspectable;
@@ -1362,6 +1450,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIAsyncOperationWithProgress_2_UINT32_UINT32_FWD_DEFINED__
+#define ____FIAsyncOperationWithProgress_2_UINT32_UINT32_FWD_DEFINED__
+typedef interface __FIAsyncOperationWithProgress_2_UINT32_UINT32 __FIAsyncOperationWithProgress_2_UINT32_UINT32;
+#ifdef __cplusplus
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32 ABI::Windows::Foundation::IAsyncOperationWithProgress<UINT32,UINT32 >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FIReference_1_BYTE_FWD_DEFINED__
 #define ____FIReference_1_BYTE_FWD_DEFINED__
 typedef interface __FIReference_1_BYTE __FIReference_1_BYTE;
@@ -1370,14 +1466,6 @@
 #endif /* __cplusplus */
 #endif
 
-#ifndef ____FIReference_1_INT32_FWD_DEFINED__
-#define ____FIReference_1_INT32_FWD_DEFINED__
-typedef interface __FIReference_1_INT32 __FIReference_1_INT32;
-#ifdef __cplusplus
-#define __FIReference_1_INT32 ABI::Windows::Foundation::IReference<INT32 >
-#endif /* __cplusplus */
-#endif
-
 #ifndef ____FIReference_1_DOUBLE_FWD_DEFINED__
 #define ____FIReference_1_DOUBLE_FWD_DEFINED__
 typedef interface __FIReference_1_DOUBLE __FIReference_1_DOUBLE;
@@ -1394,6 +1482,38 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIReference_1_GUID_FWD_DEFINED__
+#define ____FIReference_1_GUID_FWD_DEFINED__
+typedef interface __FIReference_1_GUID __FIReference_1_GUID;
+#ifdef __cplusplus
+#define __FIReference_1_GUID ABI::Windows::Foundation::IReference<GUID >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_INT16_FWD_DEFINED__
+#define ____FIReference_1_INT16_FWD_DEFINED__
+typedef interface __FIReference_1_INT16 __FIReference_1_INT16;
+#ifdef __cplusplus
+#define __FIReference_1_INT16 ABI::Windows::Foundation::IReference<INT16 >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_INT32_FWD_DEFINED__
+#define ____FIReference_1_INT32_FWD_DEFINED__
+typedef interface __FIReference_1_INT32 __FIReference_1_INT32;
+#ifdef __cplusplus
+#define __FIReference_1_INT32 ABI::Windows::Foundation::IReference<INT32 >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_INT64_FWD_DEFINED__
+#define ____FIReference_1_INT64_FWD_DEFINED__
+typedef interface __FIReference_1_INT64 __FIReference_1_INT64;
+#ifdef __cplusplus
+#define __FIReference_1_INT64 ABI::Windows::Foundation::IReference<INT64 >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FIReference_1_UINT32_FWD_DEFINED__
 #define ____FIReference_1_UINT32_FWD_DEFINED__
 typedef interface __FIReference_1_UINT32 __FIReference_1_UINT32;
@@ -1418,6 +1538,46 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIReference_1_Point_FWD_DEFINED__
+#define ____FIReference_1_Point_FWD_DEFINED__
+typedef interface __FIReference_1_Point __FIReference_1_Point;
+#ifdef __cplusplus
+#define __FIReference_1_Point ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::Point >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_Rect_FWD_DEFINED__
+#define ____FIReference_1_Rect_FWD_DEFINED__
+typedef interface __FIReference_1_Rect __FIReference_1_Rect;
+#ifdef __cplusplus
+#define __FIReference_1_Rect ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::Rect >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_Size_FWD_DEFINED__
+#define ____FIReference_1_Size_FWD_DEFINED__
+typedef interface __FIReference_1_Size __FIReference_1_Size;
+#ifdef __cplusplus
+#define __FIReference_1_Size ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::Size >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_TimeSpan_FWD_DEFINED__
+#define ____FIReference_1_TimeSpan_FWD_DEFINED__
+typedef interface __FIReference_1_TimeSpan __FIReference_1_TimeSpan;
+#ifdef __cplusplus
+#define __FIReference_1_TimeSpan ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::TimeSpan >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIReference_1_boolean_FWD_DEFINED__
+#define ____FIReference_1_boolean_FWD_DEFINED__
+typedef interface __FIReference_1_boolean __FIReference_1_boolean;
+#ifdef __cplusplus
+#define __FIReference_1_boolean ABI::Windows::Foundation::IReference<boolean >
+#endif /* __cplusplus */
+#endif
+
 /*****************************************************************************
  * IAsyncActionCompletedHandler interface
  */
@@ -8226,6 +8386,190 @@
 #endif  /* ____FIAsyncOperationCompletedHandler_1_UINT32_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
+ * IAsyncOperationProgressHandler<UINT32,UINT32 > interface
+ */
+#ifndef ____FIAsyncOperationProgressHandler_2_UINT32_UINT32_INTERFACE_DEFINED__
+#define ____FIAsyncOperationProgressHandler_2_UINT32_UINT32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperationProgressHandler_2_UINT32_UINT32, 0xea0fe405, 0xd432, 0x5ac7, 0x9e,0xf8, 0x5a,0x65,0xe1,0xf9,0x7d,0x7e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("ea0fe405-d432-5ac7-9ef8-5a65e1f97d7e")
+            IAsyncOperationProgressHandler<UINT32,UINT32 > : IAsyncOperationProgressHandler_impl<UINT32, UINT32 >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperationProgressHandler_2_UINT32_UINT32, 0xea0fe405, 0xd432, 0x5ac7, 0x9e,0xf8, 0x5a,0x65,0xe1,0xf9,0x7d,0x7e)
+#endif
+#else
+typedef struct __FIAsyncOperationProgressHandler_2_UINT32_UINT32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperationProgressHandler_2_UINT32_UINT32 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperationProgressHandler_2_UINT32_UINT32 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperationProgressHandler_2_UINT32_UINT32 *This);
+
+    /*** IAsyncOperationProgressHandler<UINT32,UINT32 > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FIAsyncOperationProgressHandler_2_UINT32_UINT32 *This,
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *info,
+        UINT32 progress);
+
+    END_INTERFACE
+} __FIAsyncOperationProgressHandler_2_UINT32_UINT32Vtbl;
+
+interface __FIAsyncOperationProgressHandler_2_UINT32_UINT32 {
+    CONST_VTBL __FIAsyncOperationProgressHandler_2_UINT32_UINT32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperationProgressHandler_2_UINT32_UINT32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperationProgressHandler_2_UINT32_UINT32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperationProgressHandler_2_UINT32_UINT32_Release(This) (This)->lpVtbl->Release(This)
+/*** IAsyncOperationProgressHandler<UINT32,UINT32 > methods ***/
+#define __FIAsyncOperationProgressHandler_2_UINT32_UINT32_Invoke(This,info,progress) (This)->lpVtbl->Invoke(This,info,progress)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationProgressHandler_2_UINT32_UINT32_QueryInterface(__FIAsyncOperationProgressHandler_2_UINT32_UINT32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationProgressHandler_2_UINT32_UINT32_AddRef(__FIAsyncOperationProgressHandler_2_UINT32_UINT32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationProgressHandler_2_UINT32_UINT32_Release(__FIAsyncOperationProgressHandler_2_UINT32_UINT32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAsyncOperationProgressHandler<UINT32,UINT32 > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationProgressHandler_2_UINT32_UINT32_Invoke(__FIAsyncOperationProgressHandler_2_UINT32_UINT32* This,__FIAsyncOperationWithProgress_2_UINT32_UINT32 *info,UINT32 progress) {
+    return This->lpVtbl->Invoke(This,info,progress);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperationProgressHandler_UINT32_UINT32 IID___FIAsyncOperationProgressHandler_2_UINT32_UINT32
+#define IAsyncOperationProgressHandler_UINT32_UINT32Vtbl __FIAsyncOperationProgressHandler_2_UINT32_UINT32Vtbl
+#define IAsyncOperationProgressHandler_UINT32_UINT32 __FIAsyncOperationProgressHandler_2_UINT32_UINT32
+#define IAsyncOperationProgressHandler_UINT32_UINT32_QueryInterface __FIAsyncOperationProgressHandler_2_UINT32_UINT32_QueryInterface
+#define IAsyncOperationProgressHandler_UINT32_UINT32_AddRef __FIAsyncOperationProgressHandler_2_UINT32_UINT32_AddRef
+#define IAsyncOperationProgressHandler_UINT32_UINT32_Release __FIAsyncOperationProgressHandler_2_UINT32_UINT32_Release
+#define IAsyncOperationProgressHandler_UINT32_UINT32_Invoke __FIAsyncOperationProgressHandler_2_UINT32_UINT32_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperationProgressHandler_2_UINT32_UINT32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAsyncOperationWithProgressCompletedHandler<UINT32,UINT32 > interface
+ */
+#ifndef ____FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_INTERFACE_DEFINED__
+#define ____FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32, 0x1e466dc5, 0x840f, 0x54f9, 0xb8,0x77, 0x5e,0x3a,0x9f,0x4b,0x6c,0x74);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("1e466dc5-840f-54f9-b877-5e3a9f4b6c74")
+            IAsyncOperationWithProgressCompletedHandler<UINT32,UINT32 > : IAsyncOperationWithProgressCompletedHandler_impl<UINT32, UINT32 >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32, 0x1e466dc5, 0x840f, 0x54f9, 0xb8,0x77, 0x5e,0x3a,0x9f,0x4b,0x6c,0x74)
+#endif
+#else
+typedef struct __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 *This);
+
+    /*** IAsyncOperationWithProgressCompletedHandler<UINT32,UINT32 > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 *This,
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *info,
+        AsyncStatus status);
+
+    END_INTERFACE
+} __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32Vtbl;
+
+interface __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 {
+    CONST_VTBL __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_Release(This) (This)->lpVtbl->Release(This)
+/*** IAsyncOperationWithProgressCompletedHandler<UINT32,UINT32 > methods ***/
+#define __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_QueryInterface(__FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_AddRef(__FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_Release(__FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAsyncOperationWithProgressCompletedHandler<UINT32,UINT32 > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_Invoke(__FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32* This,__FIAsyncOperationWithProgress_2_UINT32_UINT32 *info,AsyncStatus status) {
+    return This->lpVtbl->Invoke(This,info,status);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperationWithProgressCompletedHandler_UINT32_UINT32 IID___FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32
+#define IAsyncOperationWithProgressCompletedHandler_UINT32_UINT32Vtbl __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32Vtbl
+#define IAsyncOperationWithProgressCompletedHandler_UINT32_UINT32 __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32
+#define IAsyncOperationWithProgressCompletedHandler_UINT32_UINT32_QueryInterface __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_QueryInterface
+#define IAsyncOperationWithProgressCompletedHandler_UINT32_UINT32_AddRef __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_AddRef
+#define IAsyncOperationWithProgressCompletedHandler_UINT32_UINT32_Release __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_Release
+#define IAsyncOperationWithProgressCompletedHandler_UINT32_UINT32_Invoke __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
  * IAsyncOperation<IInspectable* > interface
  */
 #ifndef ____FIAsyncOperation_1_IInspectable_INTERFACE_DEFINED__
@@ -8646,6 +8990,164 @@
 #endif  /* ____FIAsyncOperation_1_UINT32_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
+ * IAsyncOperationWithProgress<UINT32,UINT32 > interface
+ */
+#ifndef ____FIAsyncOperationWithProgress_2_UINT32_UINT32_INTERFACE_DEFINED__
+#define ____FIAsyncOperationWithProgress_2_UINT32_UINT32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperationWithProgress_2_UINT32_UINT32, 0xeccb574a, 0xc684, 0x5572, 0xa6,0x79, 0x6b,0x08,0x42,0xcf,0xb5,0x7f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("eccb574a-c684-5572-a679-6b0842cfb57f")
+            IAsyncOperationWithProgress<UINT32,UINT32 > : IAsyncOperationWithProgress_impl<UINT32, UINT32 >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperationWithProgress_2_UINT32_UINT32, 0xeccb574a, 0xc684, 0x5572, 0xa6,0x79, 0x6b,0x08,0x42,0xcf,0xb5,0x7f)
+#endif
+#else
+typedef struct __FIAsyncOperationWithProgress_2_UINT32_UINT32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This,
+        TrustLevel *trustLevel);
+
+    /*** IAsyncOperationWithProgress<UINT32,UINT32 > methods ***/
+    HRESULT (STDMETHODCALLTYPE *put_Progress)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This,
+        __FIAsyncOperationProgressHandler_2_UINT32_UINT32 *handler);
+
+    HRESULT (STDMETHODCALLTYPE *get_Progress)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This,
+        __FIAsyncOperationProgressHandler_2_UINT32_UINT32 **handler);
+
+    HRESULT (STDMETHODCALLTYPE *put_Completed)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This,
+        __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 *handler);
+
+    HRESULT (STDMETHODCALLTYPE *get_Completed)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This,
+        __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 **handler);
+
+    HRESULT (STDMETHODCALLTYPE *GetResults)(
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 *This,
+        UINT32 *results);
+
+    END_INTERFACE
+} __FIAsyncOperationWithProgress_2_UINT32_UINT32Vtbl;
+
+interface __FIAsyncOperationWithProgress_2_UINT32_UINT32 {
+    CONST_VTBL __FIAsyncOperationWithProgress_2_UINT32_UINT32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAsyncOperationWithProgress<UINT32,UINT32 > methods ***/
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_put_Progress(This,handler) (This)->lpVtbl->put_Progress(This,handler)
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_get_Progress(This,handler) (This)->lpVtbl->get_Progress(This,handler)
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+#define __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_QueryInterface(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationWithProgress_2_UINT32_UINT32_AddRef(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationWithProgress_2_UINT32_UINT32_Release(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetIids(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetRuntimeClassName(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetTrustLevel(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAsyncOperationWithProgress<UINT32,UINT32 > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_put_Progress(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,__FIAsyncOperationProgressHandler_2_UINT32_UINT32 *handler) {
+    return This->lpVtbl->put_Progress(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_get_Progress(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,__FIAsyncOperationProgressHandler_2_UINT32_UINT32 **handler) {
+    return This->lpVtbl->get_Progress(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_put_Completed(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,__FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 *handler) {
+    return This->lpVtbl->put_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_get_Completed(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,__FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32 **handler) {
+    return This->lpVtbl->get_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetResults(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,UINT32 *results) {
+    return This->lpVtbl->GetResults(This,results);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperationWithProgress_UINT32_UINT32 IID___FIAsyncOperationWithProgress_2_UINT32_UINT32
+#define IAsyncOperationWithProgress_UINT32_UINT32Vtbl __FIAsyncOperationWithProgress_2_UINT32_UINT32Vtbl
+#define IAsyncOperationWithProgress_UINT32_UINT32 __FIAsyncOperationWithProgress_2_UINT32_UINT32
+#define IAsyncOperationWithProgress_UINT32_UINT32_QueryInterface __FIAsyncOperationWithProgress_2_UINT32_UINT32_QueryInterface
+#define IAsyncOperationWithProgress_UINT32_UINT32_AddRef __FIAsyncOperationWithProgress_2_UINT32_UINT32_AddRef
+#define IAsyncOperationWithProgress_UINT32_UINT32_Release __FIAsyncOperationWithProgress_2_UINT32_UINT32_Release
+#define IAsyncOperationWithProgress_UINT32_UINT32_GetIids __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetIids
+#define IAsyncOperationWithProgress_UINT32_UINT32_GetRuntimeClassName __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetRuntimeClassName
+#define IAsyncOperationWithProgress_UINT32_UINT32_GetTrustLevel __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetTrustLevel
+#define IAsyncOperationWithProgress_UINT32_UINT32_put_Progress __FIAsyncOperationWithProgress_2_UINT32_UINT32_put_Progress
+#define IAsyncOperationWithProgress_UINT32_UINT32_get_Progress __FIAsyncOperationWithProgress_2_UINT32_UINT32_get_Progress
+#define IAsyncOperationWithProgress_UINT32_UINT32_put_Completed __FIAsyncOperationWithProgress_2_UINT32_UINT32_put_Completed
+#define IAsyncOperationWithProgress_UINT32_UINT32_get_Completed __FIAsyncOperationWithProgress_2_UINT32_UINT32_get_Completed
+#define IAsyncOperationWithProgress_UINT32_UINT32_GetResults __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetResults
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperationWithProgress_2_UINT32_UINT32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
  * IReference<BYTE > interface
  */
 #ifndef ____FIReference_1_BYTE_INTERFACE_DEFINED__
@@ -8768,128 +9270,6 @@
 #endif  /* ____FIReference_1_BYTE_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
- * IReference<INT32 > interface
- */
-#ifndef ____FIReference_1_INT32_INTERFACE_DEFINED__
-#define ____FIReference_1_INT32_INTERFACE_DEFINED__
-
-DEFINE_GUID(IID___FIReference_1_INT32, 0x548cefbd, 0xbc8a, 0x5fa0, 0x8d,0xf2, 0x95,0x74,0x40,0xfc,0x8b,0xf4);
-#if defined(__cplusplus) && !defined(CINTERFACE)
-} /* extern "C" */
-namespace ABI {
-    namespace Windows {
-        namespace Foundation {
-            template<>
-            MIDL_INTERFACE("548cefbd-bc8a-5fa0-8df2-957440fc8bf4")
-            IReference<INT32 > : IReference_impl<INT32 >
-            {
-            };
-        }
-    }
-}
-extern "C" {
-#ifdef __CRT_UUID_DECL
-__CRT_UUID_DECL(__FIReference_1_INT32, 0x548cefbd, 0xbc8a, 0x5fa0, 0x8d,0xf2, 0x95,0x74,0x40,0xfc,0x8b,0xf4)
-#endif
-#else
-typedef struct __FIReference_1_INT32Vtbl {
-    BEGIN_INTERFACE
-
-    /*** IUnknown methods ***/
-    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
-        __FIReference_1_INT32 *This,
-        REFIID riid,
-        void **ppvObject);
-
-    ULONG (STDMETHODCALLTYPE *AddRef)(
-        __FIReference_1_INT32 *This);
-
-    ULONG (STDMETHODCALLTYPE *Release)(
-        __FIReference_1_INT32 *This);
-
-    /*** IInspectable methods ***/
-    HRESULT (STDMETHODCALLTYPE *GetIids)(
-        __FIReference_1_INT32 *This,
-        ULONG *iidCount,
-        IID **iids);
-
-    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
-        __FIReference_1_INT32 *This,
-        HSTRING *className);
-
-    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
-        __FIReference_1_INT32 *This,
-        TrustLevel *trustLevel);
-
-    /*** IReference<INT32 > methods ***/
-    HRESULT (STDMETHODCALLTYPE *get_Value)(
-        __FIReference_1_INT32 *This,
-        INT32 *value);
-
-    END_INTERFACE
-} __FIReference_1_INT32Vtbl;
-
-interface __FIReference_1_INT32 {
-    CONST_VTBL __FIReference_1_INT32Vtbl* lpVtbl;
-};
-
-#ifdef COBJMACROS
-#ifndef WIDL_C_INLINE_WRAPPERS
-/*** IUnknown methods ***/
-#define __FIReference_1_INT32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define __FIReference_1_INT32_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define __FIReference_1_INT32_Release(This) (This)->lpVtbl->Release(This)
-/*** IInspectable methods ***/
-#define __FIReference_1_INT32_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
-#define __FIReference_1_INT32_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
-#define __FIReference_1_INT32_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
-/*** IReference<INT32 > methods ***/
-#define __FIReference_1_INT32_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
-#else
-/*** IUnknown methods ***/
-static __WIDL_INLINE HRESULT __FIReference_1_INT32_QueryInterface(__FIReference_1_INT32* This,REFIID riid,void **ppvObject) {
-    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
-}
-static __WIDL_INLINE ULONG __FIReference_1_INT32_AddRef(__FIReference_1_INT32* This) {
-    return This->lpVtbl->AddRef(This);
-}
-static __WIDL_INLINE ULONG __FIReference_1_INT32_Release(__FIReference_1_INT32* This) {
-    return This->lpVtbl->Release(This);
-}
-/*** IInspectable methods ***/
-static __WIDL_INLINE HRESULT __FIReference_1_INT32_GetIids(__FIReference_1_INT32* This,ULONG *iidCount,IID **iids) {
-    return This->lpVtbl->GetIids(This,iidCount,iids);
-}
-static __WIDL_INLINE HRESULT __FIReference_1_INT32_GetRuntimeClassName(__FIReference_1_INT32* This,HSTRING *className) {
-    return This->lpVtbl->GetRuntimeClassName(This,className);
-}
-static __WIDL_INLINE HRESULT __FIReference_1_INT32_GetTrustLevel(__FIReference_1_INT32* This,TrustLevel *trustLevel) {
-    return This->lpVtbl->GetTrustLevel(This,trustLevel);
-}
-/*** IReference<INT32 > methods ***/
-static __WIDL_INLINE HRESULT __FIReference_1_INT32_get_Value(__FIReference_1_INT32* This,INT32 *value) {
-    return This->lpVtbl->get_Value(This,value);
-}
-#endif
-#ifdef WIDL_using_Windows_Foundation
-#define IID_IReference_INT32 IID___FIReference_1_INT32
-#define IReference_INT32Vtbl __FIReference_1_INT32Vtbl
-#define IReference_INT32 __FIReference_1_INT32
-#define IReference_INT32_QueryInterface __FIReference_1_INT32_QueryInterface
-#define IReference_INT32_AddRef __FIReference_1_INT32_AddRef
-#define IReference_INT32_Release __FIReference_1_INT32_Release
-#define IReference_INT32_GetIids __FIReference_1_INT32_GetIids
-#define IReference_INT32_GetRuntimeClassName __FIReference_1_INT32_GetRuntimeClassName
-#define IReference_INT32_GetTrustLevel __FIReference_1_INT32_GetTrustLevel
-#define IReference_INT32_get_Value __FIReference_1_INT32_get_Value
-#endif /* WIDL_using_Windows_Foundation */
-#endif
-
-#endif
-
-#endif  /* ____FIReference_1_INT32_INTERFACE_DEFINED__ */
-
-/*****************************************************************************
  * IReference<DOUBLE > interface
  */
 #ifndef ____FIReference_1_DOUBLE_INTERFACE_DEFINED__
@@ -9134,6 +9514,494 @@
 #endif  /* ____FIReference_1_FLOAT_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
+ * IReference<GUID > interface
+ */
+#ifndef ____FIReference_1_GUID_INTERFACE_DEFINED__
+#define ____FIReference_1_GUID_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIReference_1_GUID, 0x7d50f649, 0x632c, 0x51f9, 0x84,0x9a, 0xee,0x49,0x42,0x89,0x33,0xea);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("7d50f649-632c-51f9-849a-ee49428933ea")
+            IReference<GUID > : IReference_impl<GUID >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIReference_1_GUID, 0x7d50f649, 0x632c, 0x51f9, 0x84,0x9a, 0xee,0x49,0x42,0x89,0x33,0xea)
+#endif
+#else
+typedef struct __FIReference_1_GUIDVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIReference_1_GUID *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIReference_1_GUID *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIReference_1_GUID *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIReference_1_GUID *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIReference_1_GUID *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIReference_1_GUID *This,
+        TrustLevel *trustLevel);
+
+    /*** IReference<GUID > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIReference_1_GUID *This,
+        GUID *value);
+
+    END_INTERFACE
+} __FIReference_1_GUIDVtbl;
+
+interface __FIReference_1_GUID {
+    CONST_VTBL __FIReference_1_GUIDVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIReference_1_GUID_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIReference_1_GUID_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIReference_1_GUID_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIReference_1_GUID_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIReference_1_GUID_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIReference_1_GUID_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IReference<GUID > methods ***/
+#define __FIReference_1_GUID_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_GUID_QueryInterface(__FIReference_1_GUID* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIReference_1_GUID_AddRef(__FIReference_1_GUID* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIReference_1_GUID_Release(__FIReference_1_GUID* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_GUID_GetIids(__FIReference_1_GUID* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_GUID_GetRuntimeClassName(__FIReference_1_GUID* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_GUID_GetTrustLevel(__FIReference_1_GUID* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IReference<GUID > methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_GUID_get_Value(__FIReference_1_GUID* This,GUID *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IReference_GUID IID___FIReference_1_GUID
+#define IReference_GUIDVtbl __FIReference_1_GUIDVtbl
+#define IReference_GUID __FIReference_1_GUID
+#define IReference_GUID_QueryInterface __FIReference_1_GUID_QueryInterface
+#define IReference_GUID_AddRef __FIReference_1_GUID_AddRef
+#define IReference_GUID_Release __FIReference_1_GUID_Release
+#define IReference_GUID_GetIids __FIReference_1_GUID_GetIids
+#define IReference_GUID_GetRuntimeClassName __FIReference_1_GUID_GetRuntimeClassName
+#define IReference_GUID_GetTrustLevel __FIReference_1_GUID_GetTrustLevel
+#define IReference_GUID_get_Value __FIReference_1_GUID_get_Value
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIReference_1_GUID_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IReference<INT16 > interface
+ */
+#ifndef ____FIReference_1_INT16_INTERFACE_DEFINED__
+#define ____FIReference_1_INT16_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIReference_1_INT16, 0x6ec9e41b, 0x6709, 0x5647, 0x99,0x18, 0xa1,0x27,0x01,0x10,0xfc,0x4e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("6ec9e41b-6709-5647-9918-a1270110fc4e")
+            IReference<INT16 > : IReference_impl<INT16 >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIReference_1_INT16, 0x6ec9e41b, 0x6709, 0x5647, 0x99,0x18, 0xa1,0x27,0x01,0x10,0xfc,0x4e)
+#endif
+#else
+typedef struct __FIReference_1_INT16Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIReference_1_INT16 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIReference_1_INT16 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIReference_1_INT16 *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIReference_1_INT16 *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIReference_1_INT16 *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIReference_1_INT16 *This,
+        TrustLevel *trustLevel);
+
+    /*** IReference<INT16 > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIReference_1_INT16 *This,
+        INT16 *value);
+
+    END_INTERFACE
+} __FIReference_1_INT16Vtbl;
+
+interface __FIReference_1_INT16 {
+    CONST_VTBL __FIReference_1_INT16Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIReference_1_INT16_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIReference_1_INT16_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIReference_1_INT16_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIReference_1_INT16_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIReference_1_INT16_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIReference_1_INT16_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IReference<INT16 > methods ***/
+#define __FIReference_1_INT16_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_INT16_QueryInterface(__FIReference_1_INT16* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIReference_1_INT16_AddRef(__FIReference_1_INT16* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIReference_1_INT16_Release(__FIReference_1_INT16* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_INT16_GetIids(__FIReference_1_INT16* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_INT16_GetRuntimeClassName(__FIReference_1_INT16* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_INT16_GetTrustLevel(__FIReference_1_INT16* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IReference<INT16 > methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_INT16_get_Value(__FIReference_1_INT16* This,INT16 *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IReference_INT16 IID___FIReference_1_INT16
+#define IReference_INT16Vtbl __FIReference_1_INT16Vtbl
+#define IReference_INT16 __FIReference_1_INT16
+#define IReference_INT16_QueryInterface __FIReference_1_INT16_QueryInterface
+#define IReference_INT16_AddRef __FIReference_1_INT16_AddRef
+#define IReference_INT16_Release __FIReference_1_INT16_Release
+#define IReference_INT16_GetIids __FIReference_1_INT16_GetIids
+#define IReference_INT16_GetRuntimeClassName __FIReference_1_INT16_GetRuntimeClassName
+#define IReference_INT16_GetTrustLevel __FIReference_1_INT16_GetTrustLevel
+#define IReference_INT16_get_Value __FIReference_1_INT16_get_Value
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIReference_1_INT16_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IReference<INT32 > interface
+ */
+#ifndef ____FIReference_1_INT32_INTERFACE_DEFINED__
+#define ____FIReference_1_INT32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIReference_1_INT32, 0x548cefbd, 0xbc8a, 0x5fa0, 0x8d,0xf2, 0x95,0x74,0x40,0xfc,0x8b,0xf4);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("548cefbd-bc8a-5fa0-8df2-957440fc8bf4")
+            IReference<INT32 > : IReference_impl<INT32 >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIReference_1_INT32, 0x548cefbd, 0xbc8a, 0x5fa0, 0x8d,0xf2, 0x95,0x74,0x40,0xfc,0x8b,0xf4)
+#endif
+#else
+typedef struct __FIReference_1_INT32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIReference_1_INT32 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIReference_1_INT32 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIReference_1_INT32 *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIReference_1_INT32 *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIReference_1_INT32 *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIReference_1_INT32 *This,
+        TrustLevel *trustLevel);
+
+    /*** IReference<INT32 > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIReference_1_INT32 *This,
+        INT32 *value);
+
+    END_INTERFACE
+} __FIReference_1_INT32Vtbl;
+
+interface __FIReference_1_INT32 {
+    CONST_VTBL __FIReference_1_INT32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIReference_1_INT32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIReference_1_INT32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIReference_1_INT32_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIReference_1_INT32_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIReference_1_INT32_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIReference_1_INT32_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IReference<INT32 > methods ***/
+#define __FIReference_1_INT32_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_INT32_QueryInterface(__FIReference_1_INT32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIReference_1_INT32_AddRef(__FIReference_1_INT32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIReference_1_INT32_Release(__FIReference_1_INT32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_INT32_GetIids(__FIReference_1_INT32* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_INT32_GetRuntimeClassName(__FIReference_1_INT32* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_INT32_GetTrustLevel(__FIReference_1_INT32* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IReference<INT32 > methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_INT32_get_Value(__FIReference_1_INT32* This,INT32 *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IReference_INT32 IID___FIReference_1_INT32
+#define IReference_INT32Vtbl __FIReference_1_INT32Vtbl
+#define IReference_INT32 __FIReference_1_INT32
+#define IReference_INT32_QueryInterface __FIReference_1_INT32_QueryInterface
+#define IReference_INT32_AddRef __FIReference_1_INT32_AddRef
+#define IReference_INT32_Release __FIReference_1_INT32_Release
+#define IReference_INT32_GetIids __FIReference_1_INT32_GetIids
+#define IReference_INT32_GetRuntimeClassName __FIReference_1_INT32_GetRuntimeClassName
+#define IReference_INT32_GetTrustLevel __FIReference_1_INT32_GetTrustLevel
+#define IReference_INT32_get_Value __FIReference_1_INT32_get_Value
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIReference_1_INT32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IReference<INT64 > interface
+ */
+#ifndef ____FIReference_1_INT64_INTERFACE_DEFINED__
+#define ____FIReference_1_INT64_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIReference_1_INT64, 0x4dda9e24, 0xe69f, 0x5c6a, 0xa0,0xa6, 0x93,0x42,0x73,0x65,0xaf,0x2a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("4dda9e24-e69f-5c6a-a0a6-93427365af2a")
+            IReference<INT64 > : IReference_impl<INT64 >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIReference_1_INT64, 0x4dda9e24, 0xe69f, 0x5c6a, 0xa0,0xa6, 0x93,0x42,0x73,0x65,0xaf,0x2a)
+#endif
+#else
+typedef struct __FIReference_1_INT64Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIReference_1_INT64 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIReference_1_INT64 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIReference_1_INT64 *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIReference_1_INT64 *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIReference_1_INT64 *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIReference_1_INT64 *This,
+        TrustLevel *trustLevel);
+
+    /*** IReference<INT64 > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIReference_1_INT64 *This,
+        INT64 *value);
+
+    END_INTERFACE
+} __FIReference_1_INT64Vtbl;
+
+interface __FIReference_1_INT64 {
+    CONST_VTBL __FIReference_1_INT64Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIReference_1_INT64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIReference_1_INT64_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIReference_1_INT64_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIReference_1_INT64_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIReference_1_INT64_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIReference_1_INT64_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IReference<INT64 > methods ***/
+#define __FIReference_1_INT64_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_INT64_QueryInterface(__FIReference_1_INT64* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIReference_1_INT64_AddRef(__FIReference_1_INT64* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIReference_1_INT64_Release(__FIReference_1_INT64* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_INT64_GetIids(__FIReference_1_INT64* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_INT64_GetRuntimeClassName(__FIReference_1_INT64* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_INT64_GetTrustLevel(__FIReference_1_INT64* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IReference<INT64 > methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_INT64_get_Value(__FIReference_1_INT64* This,INT64 *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IReference_INT64 IID___FIReference_1_INT64
+#define IReference_INT64Vtbl __FIReference_1_INT64Vtbl
+#define IReference_INT64 __FIReference_1_INT64
+#define IReference_INT64_QueryInterface __FIReference_1_INT64_QueryInterface
+#define IReference_INT64_AddRef __FIReference_1_INT64_AddRef
+#define IReference_INT64_Release __FIReference_1_INT64_Release
+#define IReference_INT64_GetIids __FIReference_1_INT64_GetIids
+#define IReference_INT64_GetRuntimeClassName __FIReference_1_INT64_GetRuntimeClassName
+#define IReference_INT64_GetTrustLevel __FIReference_1_INT64_GetTrustLevel
+#define IReference_INT64_get_Value __FIReference_1_INT64_get_Value
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIReference_1_INT64_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
  * IReference<UINT32 > interface
  */
 #ifndef ____FIReference_1_UINT32_INTERFACE_DEFINED__
@@ -9500,6 +10368,616 @@
 #endif  /* ____FIReference_1_DateTime_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
+ * IReference<ABI::Windows::Foundation::Point > interface
+ */
+#ifndef ____FIReference_1_Point_INTERFACE_DEFINED__
+#define ____FIReference_1_Point_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIReference_1_Point, 0x84f14c22, 0xa00a, 0x5272, 0x8d,0x3d, 0x82,0x11,0x2e,0x66,0xdf,0x00);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("84f14c22-a00a-5272-8d3d-82112e66df00")
+            IReference<ABI::Windows::Foundation::Point > : IReference_impl<ABI::Windows::Foundation::Point >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIReference_1_Point, 0x84f14c22, 0xa00a, 0x5272, 0x8d,0x3d, 0x82,0x11,0x2e,0x66,0xdf,0x00)
+#endif
+#else
+typedef struct __FIReference_1_PointVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIReference_1_Point *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIReference_1_Point *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIReference_1_Point *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIReference_1_Point *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIReference_1_Point *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIReference_1_Point *This,
+        TrustLevel *trustLevel);
+
+    /*** IReference<ABI::Windows::Foundation::Point > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIReference_1_Point *This,
+        __x_ABI_CWindows_CFoundation_CPoint *value);
+
+    END_INTERFACE
+} __FIReference_1_PointVtbl;
+
+interface __FIReference_1_Point {
+    CONST_VTBL __FIReference_1_PointVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIReference_1_Point_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIReference_1_Point_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIReference_1_Point_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIReference_1_Point_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIReference_1_Point_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIReference_1_Point_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IReference<ABI::Windows::Foundation::Point > methods ***/
+#define __FIReference_1_Point_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_Point_QueryInterface(__FIReference_1_Point* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIReference_1_Point_AddRef(__FIReference_1_Point* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIReference_1_Point_Release(__FIReference_1_Point* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_Point_GetIids(__FIReference_1_Point* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_Point_GetRuntimeClassName(__FIReference_1_Point* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_Point_GetTrustLevel(__FIReference_1_Point* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IReference<ABI::Windows::Foundation::Point > methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_Point_get_Value(__FIReference_1_Point* This,__x_ABI_CWindows_CFoundation_CPoint *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IReference_Point IID___FIReference_1_Point
+#define IReference_PointVtbl __FIReference_1_PointVtbl
+#define IReference_Point __FIReference_1_Point
+#define IReference_Point_QueryInterface __FIReference_1_Point_QueryInterface
+#define IReference_Point_AddRef __FIReference_1_Point_AddRef
+#define IReference_Point_Release __FIReference_1_Point_Release
+#define IReference_Point_GetIids __FIReference_1_Point_GetIids
+#define IReference_Point_GetRuntimeClassName __FIReference_1_Point_GetRuntimeClassName
+#define IReference_Point_GetTrustLevel __FIReference_1_Point_GetTrustLevel
+#define IReference_Point_get_Value __FIReference_1_Point_get_Value
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIReference_1_Point_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IReference<ABI::Windows::Foundation::Rect > interface
+ */
+#ifndef ____FIReference_1_Rect_INTERFACE_DEFINED__
+#define ____FIReference_1_Rect_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIReference_1_Rect, 0x80423f11, 0x054f, 0x5eac, 0xaf,0xd3, 0x63,0xb6,0xce,0x15,0xe7,0x7b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("80423f11-054f-5eac-afd3-63b6ce15e77b")
+            IReference<ABI::Windows::Foundation::Rect > : IReference_impl<ABI::Windows::Foundation::Rect >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIReference_1_Rect, 0x80423f11, 0x054f, 0x5eac, 0xaf,0xd3, 0x63,0xb6,0xce,0x15,0xe7,0x7b)
+#endif
+#else
+typedef struct __FIReference_1_RectVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIReference_1_Rect *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIReference_1_Rect *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIReference_1_Rect *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIReference_1_Rect *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIReference_1_Rect *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIReference_1_Rect *This,
+        TrustLevel *trustLevel);
+
+    /*** IReference<ABI::Windows::Foundation::Rect > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIReference_1_Rect *This,
+        __x_ABI_CWindows_CFoundation_CRect *value);
+
+    END_INTERFACE
+} __FIReference_1_RectVtbl;
+
+interface __FIReference_1_Rect {
+    CONST_VTBL __FIReference_1_RectVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIReference_1_Rect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIReference_1_Rect_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIReference_1_Rect_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIReference_1_Rect_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIReference_1_Rect_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIReference_1_Rect_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IReference<ABI::Windows::Foundation::Rect > methods ***/
+#define __FIReference_1_Rect_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_Rect_QueryInterface(__FIReference_1_Rect* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIReference_1_Rect_AddRef(__FIReference_1_Rect* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIReference_1_Rect_Release(__FIReference_1_Rect* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_Rect_GetIids(__FIReference_1_Rect* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_Rect_GetRuntimeClassName(__FIReference_1_Rect* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_Rect_GetTrustLevel(__FIReference_1_Rect* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IReference<ABI::Windows::Foundation::Rect > methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_Rect_get_Value(__FIReference_1_Rect* This,__x_ABI_CWindows_CFoundation_CRect *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IReference_Rect IID___FIReference_1_Rect
+#define IReference_RectVtbl __FIReference_1_RectVtbl
+#define IReference_Rect __FIReference_1_Rect
+#define IReference_Rect_QueryInterface __FIReference_1_Rect_QueryInterface
+#define IReference_Rect_AddRef __FIReference_1_Rect_AddRef
+#define IReference_Rect_Release __FIReference_1_Rect_Release
+#define IReference_Rect_GetIids __FIReference_1_Rect_GetIids
+#define IReference_Rect_GetRuntimeClassName __FIReference_1_Rect_GetRuntimeClassName
+#define IReference_Rect_GetTrustLevel __FIReference_1_Rect_GetTrustLevel
+#define IReference_Rect_get_Value __FIReference_1_Rect_get_Value
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIReference_1_Rect_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IReference<ABI::Windows::Foundation::Size > interface
+ */
+#ifndef ____FIReference_1_Size_INTERFACE_DEFINED__
+#define ____FIReference_1_Size_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIReference_1_Size, 0x61723086, 0x8e53, 0x5276, 0x9f,0x36, 0x2a,0x4b,0xb9,0x3e,0x2b,0x75);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("61723086-8e53-5276-9f36-2a4bb93e2b75")
+            IReference<ABI::Windows::Foundation::Size > : IReference_impl<ABI::Windows::Foundation::Size >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIReference_1_Size, 0x61723086, 0x8e53, 0x5276, 0x9f,0x36, 0x2a,0x4b,0xb9,0x3e,0x2b,0x75)
+#endif
+#else
+typedef struct __FIReference_1_SizeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIReference_1_Size *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIReference_1_Size *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIReference_1_Size *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIReference_1_Size *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIReference_1_Size *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIReference_1_Size *This,
+        TrustLevel *trustLevel);
+
+    /*** IReference<ABI::Windows::Foundation::Size > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIReference_1_Size *This,
+        __x_ABI_CWindows_CFoundation_CSize *value);
+
+    END_INTERFACE
+} __FIReference_1_SizeVtbl;
+
+interface __FIReference_1_Size {
+    CONST_VTBL __FIReference_1_SizeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIReference_1_Size_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIReference_1_Size_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIReference_1_Size_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIReference_1_Size_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIReference_1_Size_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIReference_1_Size_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IReference<ABI::Windows::Foundation::Size > methods ***/
+#define __FIReference_1_Size_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_Size_QueryInterface(__FIReference_1_Size* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIReference_1_Size_AddRef(__FIReference_1_Size* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIReference_1_Size_Release(__FIReference_1_Size* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_Size_GetIids(__FIReference_1_Size* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_Size_GetRuntimeClassName(__FIReference_1_Size* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_Size_GetTrustLevel(__FIReference_1_Size* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IReference<ABI::Windows::Foundation::Size > methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_Size_get_Value(__FIReference_1_Size* This,__x_ABI_CWindows_CFoundation_CSize *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IReference_Size IID___FIReference_1_Size
+#define IReference_SizeVtbl __FIReference_1_SizeVtbl
+#define IReference_Size __FIReference_1_Size
+#define IReference_Size_QueryInterface __FIReference_1_Size_QueryInterface
+#define IReference_Size_AddRef __FIReference_1_Size_AddRef
+#define IReference_Size_Release __FIReference_1_Size_Release
+#define IReference_Size_GetIids __FIReference_1_Size_GetIids
+#define IReference_Size_GetRuntimeClassName __FIReference_1_Size_GetRuntimeClassName
+#define IReference_Size_GetTrustLevel __FIReference_1_Size_GetTrustLevel
+#define IReference_Size_get_Value __FIReference_1_Size_get_Value
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIReference_1_Size_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IReference<ABI::Windows::Foundation::TimeSpan > interface
+ */
+#ifndef ____FIReference_1_TimeSpan_INTERFACE_DEFINED__
+#define ____FIReference_1_TimeSpan_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIReference_1_TimeSpan, 0x604d0c4c, 0x91de, 0x5c2a, 0x93,0x5f, 0x36,0x2f,0x13,0xea,0xf8,0x00);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("604d0c4c-91de-5c2a-935f-362f13eaf800")
+            IReference<ABI::Windows::Foundation::TimeSpan > : IReference_impl<ABI::Windows::Foundation::TimeSpan >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIReference_1_TimeSpan, 0x604d0c4c, 0x91de, 0x5c2a, 0x93,0x5f, 0x36,0x2f,0x13,0xea,0xf8,0x00)
+#endif
+#else
+typedef struct __FIReference_1_TimeSpanVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIReference_1_TimeSpan *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIReference_1_TimeSpan *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIReference_1_TimeSpan *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIReference_1_TimeSpan *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIReference_1_TimeSpan *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIReference_1_TimeSpan *This,
+        TrustLevel *trustLevel);
+
+    /*** IReference<ABI::Windows::Foundation::TimeSpan > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIReference_1_TimeSpan *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan *value);
+
+    END_INTERFACE
+} __FIReference_1_TimeSpanVtbl;
+
+interface __FIReference_1_TimeSpan {
+    CONST_VTBL __FIReference_1_TimeSpanVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIReference_1_TimeSpan_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIReference_1_TimeSpan_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIReference_1_TimeSpan_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIReference_1_TimeSpan_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIReference_1_TimeSpan_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIReference_1_TimeSpan_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IReference<ABI::Windows::Foundation::TimeSpan > methods ***/
+#define __FIReference_1_TimeSpan_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_TimeSpan_QueryInterface(__FIReference_1_TimeSpan* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIReference_1_TimeSpan_AddRef(__FIReference_1_TimeSpan* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIReference_1_TimeSpan_Release(__FIReference_1_TimeSpan* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_TimeSpan_GetIids(__FIReference_1_TimeSpan* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_TimeSpan_GetRuntimeClassName(__FIReference_1_TimeSpan* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_TimeSpan_GetTrustLevel(__FIReference_1_TimeSpan* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IReference<ABI::Windows::Foundation::TimeSpan > methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_TimeSpan_get_Value(__FIReference_1_TimeSpan* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IReference_TimeSpan IID___FIReference_1_TimeSpan
+#define IReference_TimeSpanVtbl __FIReference_1_TimeSpanVtbl
+#define IReference_TimeSpan __FIReference_1_TimeSpan
+#define IReference_TimeSpan_QueryInterface __FIReference_1_TimeSpan_QueryInterface
+#define IReference_TimeSpan_AddRef __FIReference_1_TimeSpan_AddRef
+#define IReference_TimeSpan_Release __FIReference_1_TimeSpan_Release
+#define IReference_TimeSpan_GetIids __FIReference_1_TimeSpan_GetIids
+#define IReference_TimeSpan_GetRuntimeClassName __FIReference_1_TimeSpan_GetRuntimeClassName
+#define IReference_TimeSpan_GetTrustLevel __FIReference_1_TimeSpan_GetTrustLevel
+#define IReference_TimeSpan_get_Value __FIReference_1_TimeSpan_get_Value
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIReference_1_TimeSpan_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IReference<boolean > interface
+ */
+#ifndef ____FIReference_1_boolean_INTERFACE_DEFINED__
+#define ____FIReference_1_boolean_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIReference_1_boolean, 0x3c00fd60, 0x2950, 0x5939, 0xa2,0x1a, 0x2d,0x12,0xc5,0xa0,0x1b,0x8a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("3c00fd60-2950-5939-a21a-2d12c5a01b8a")
+            IReference<boolean > : IReference_impl<boolean >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIReference_1_boolean, 0x3c00fd60, 0x2950, 0x5939, 0xa2,0x1a, 0x2d,0x12,0xc5,0xa0,0x1b,0x8a)
+#endif
+#else
+typedef struct __FIReference_1_booleanVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIReference_1_boolean *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIReference_1_boolean *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIReference_1_boolean *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIReference_1_boolean *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIReference_1_boolean *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIReference_1_boolean *This,
+        TrustLevel *trustLevel);
+
+    /*** IReference<boolean > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIReference_1_boolean *This,
+        boolean *value);
+
+    END_INTERFACE
+} __FIReference_1_booleanVtbl;
+
+interface __FIReference_1_boolean {
+    CONST_VTBL __FIReference_1_booleanVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIReference_1_boolean_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIReference_1_boolean_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIReference_1_boolean_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIReference_1_boolean_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIReference_1_boolean_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIReference_1_boolean_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IReference<boolean > methods ***/
+#define __FIReference_1_boolean_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_boolean_QueryInterface(__FIReference_1_boolean* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIReference_1_boolean_AddRef(__FIReference_1_boolean* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIReference_1_boolean_Release(__FIReference_1_boolean* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_boolean_GetIids(__FIReference_1_boolean* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_boolean_GetRuntimeClassName(__FIReference_1_boolean* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_boolean_GetTrustLevel(__FIReference_1_boolean* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IReference<boolean > methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_boolean_get_Value(__FIReference_1_boolean* This,boolean *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IReference_boolean IID___FIReference_1_boolean
+#define IReference_booleanVtbl __FIReference_1_booleanVtbl
+#define IReference_boolean __FIReference_1_boolean
+#define IReference_boolean_QueryInterface __FIReference_1_boolean_QueryInterface
+#define IReference_boolean_AddRef __FIReference_1_boolean_AddRef
+#define IReference_boolean_Release __FIReference_1_boolean_Release
+#define IReference_boolean_GetIids __FIReference_1_boolean_GetIids
+#define IReference_boolean_GetRuntimeClassName __FIReference_1_boolean_GetRuntimeClassName
+#define IReference_boolean_GetTrustLevel __FIReference_1_boolean_GetTrustLevel
+#define IReference_boolean_get_Value __FIReference_1_boolean_get_Value
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIReference_1_boolean_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
  * ITypedEventHandler<IInspectable*,IInspectable* > interface
  */
 #ifndef ____FITypedEventHandler_2_IInspectable_IInspectable_INTERFACE_DEFINED__
diff --git a/mingw-w64-headers/include/windows.foundation.idl b/mingw-w64-headers/include/windows.foundation.idl
index 0ac0f78..f2e48bb 100644
--- a/mingw-w64-headers/include/windows.foundation.idl
+++ b/mingw-w64-headers/include/windows.foundation.idl
@@ -104,16 +104,27 @@
         interface Windows.Foundation.AsyncOperationCompletedHandler<IInspectable *>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<boolean>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<UINT32>;
+        interface Windows.Foundation.AsyncOperationProgressHandler<UINT32, UINT32>;
+        interface Windows.Foundation.AsyncOperationWithProgressCompletedHandler<UINT32, UINT32>;
         interface Windows.Foundation.IAsyncOperation<IInspectable *>;
         interface Windows.Foundation.IAsyncOperation<boolean>;
         interface Windows.Foundation.IAsyncOperation<UINT32>;
+        interface Windows.Foundation.IAsyncOperationWithProgress<UINT32, UINT32>;
         interface Windows.Foundation.IReference<BYTE>;
-        interface Windows.Foundation.IReference<INT32>;
         interface Windows.Foundation.IReference<DOUBLE>;
         interface Windows.Foundation.IReference<FLOAT>;
+        interface Windows.Foundation.IReference<GUID>;
+        interface Windows.Foundation.IReference<INT16>;
+        interface Windows.Foundation.IReference<INT32>;
+        interface Windows.Foundation.IReference<INT64>;
         interface Windows.Foundation.IReference<UINT32>;
         interface Windows.Foundation.IReference<UINT64>;
         interface Windows.Foundation.IReference<Windows.Foundation.DateTime>;
+        interface Windows.Foundation.IReference<Windows.Foundation.Point>;
+        interface Windows.Foundation.IReference<Windows.Foundation.Rect>;
+        interface Windows.Foundation.IReference<Windows.Foundation.Size>;
+        interface Windows.Foundation.IReference<Windows.Foundation.TimeSpan>;
+        interface Windows.Foundation.IReference<boolean>;
         interface Windows.Foundation.TypedEventHandler<IInspectable *, IInspectable *>;
         interface Windows.Foundation.TypedEventHandler<Windows.Foundation.IMemoryBufferReference *, IInspectable *>;
     }
diff --git a/mingw-w64-headers/include/windows.globalization.h b/mingw-w64-headers/include/windows.globalization.h
index 965b1ca..fe77b5b 100644
--- a/mingw-w64-headers/include/windows.globalization.h
+++ b/mingw-w64-headers/include/windows.globalization.h
@@ -71,6 +71,36 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics ABI::Windows::Globalization::IApplicationLanguagesStatics
+namespace ABI {
+    namespace Windows {
+        namespace Globalization {
+            interface IApplicationLanguagesStatics;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 ABI::Windows::Globalization::IApplicationLanguagesStatics2
+namespace ABI {
+    namespace Windows {
+        namespace Globalization {
+            interface IApplicationLanguagesStatics2;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CGlobalization_CILanguage_FWD_DEFINED__
 #define ____x_ABI_CWindows_CGlobalization_CILanguage_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CGlobalization_CILanguage __x_ABI_CWindows_CGlobalization_CILanguage;
@@ -266,6 +296,21 @@
 #endif /* defined __cplusplus */
 #endif /* defined ____x_ABI_CWindows_CGlobalization_CCalendar_FWD_DEFINED__ */
 
+#ifndef ____x_ABI_CWindows_CGlobalization_CApplicationLanguages_FWD_DEFINED__
+#define ____x_ABI_CWindows_CGlobalization_CApplicationLanguages_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Globalization {
+            class ApplicationLanguages;
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CGlobalization_CApplicationLanguages __x_ABI_CWindows_CGlobalization_CApplicationLanguages;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CGlobalization_CApplicationLanguages_FWD_DEFINED__ */
+
 #ifndef ____x_ABI_CWindows_CGlobalization_CLanguage_FWD_DEFINED__
 #define ____x_ABI_CWindows_CGlobalization_CLanguage_FWD_DEFINED__
 #ifdef __cplusplus
@@ -335,6 +380,7 @@
 #include <eventtoken.h>
 #include <windowscontracts.h>
 #include <windows.foundation.h>
+#include <windows.system.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -348,6 +394,36 @@
 typedef enum __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection;
 #endif /* __cplusplus */
 
+#ifndef ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics ABI::Windows::Globalization::IApplicationLanguagesStatics
+namespace ABI {
+    namespace Windows {
+        namespace Globalization {
+            interface IApplicationLanguagesStatics;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 ABI::Windows::Globalization::IApplicationLanguagesStatics2
+namespace ABI {
+    namespace Windows {
+        namespace Globalization {
+            interface IApplicationLanguagesStatics2;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CGlobalization_CICalendar_FWD_DEFINED__
 #define ____x_ABI_CWindows_CGlobalization_CICalendar_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CGlobalization_CICalendar __x_ABI_CWindows_CGlobalization_CICalendar;
@@ -2269,6 +2345,296 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*****************************************************************************
+ * IApplicationLanguagesStatics interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics, 0x75b40847, 0x0a4c, 0x4a92, 0x95,0x65, 0xfd,0x63,0xc9,0x5f,0x7a,0xed);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Globalization {
+            MIDL_INTERFACE("75b40847-0a4c-4a92-9565-fd63c95f7aed")
+            IApplicationLanguagesStatics : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_PrimaryLanguageOverride(
+                    HSTRING *value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE put_PrimaryLanguageOverride(
+                    HSTRING value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE get_Languages(
+                    ABI::Windows::Foundation::Collections::IVectorView<HSTRING > **value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE get_ManifestLanguages(
+                    ABI::Windows::Foundation::Collections::IVectorView<HSTRING > **value) = 0;
+
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics, 0x75b40847, 0x0a4c, 0x4a92, 0x95,0x65, 0xfd,0x63,0xc9,0x5f,0x7a,0xed)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStaticsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics *This,
+        TrustLevel *trustLevel);
+
+    /*** IApplicationLanguagesStatics methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_PrimaryLanguageOverride)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_PrimaryLanguageOverride)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics *This,
+        HSTRING value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Languages)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics *This,
+        __FIVectorView_1_HSTRING **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_ManifestLanguages)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics *This,
+        __FIVectorView_1_HSTRING **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStaticsVtbl;
+
+interface __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics {
+    CONST_VTBL __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStaticsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IApplicationLanguagesStatics methods ***/
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_get_PrimaryLanguageOverride(This,value) (This)->lpVtbl->get_PrimaryLanguageOverride(This,value)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_put_PrimaryLanguageOverride(This,value) (This)->lpVtbl->put_PrimaryLanguageOverride(This,value)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_get_Languages(This,value) (This)->lpVtbl->get_Languages(This,value)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_get_ManifestLanguages(This,value) (This)->lpVtbl->get_ManifestLanguages(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_QueryInterface(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_AddRef(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_Release(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_GetIids(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IApplicationLanguagesStatics methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_get_PrimaryLanguageOverride(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics* This,HSTRING *value) {
+    return This->lpVtbl->get_PrimaryLanguageOverride(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_put_PrimaryLanguageOverride(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics* This,HSTRING value) {
+    return This->lpVtbl->put_PrimaryLanguageOverride(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_get_Languages(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics* This,__FIVectorView_1_HSTRING **value) {
+    return This->lpVtbl->get_Languages(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_get_ManifestLanguages(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics* This,__FIVectorView_1_HSTRING **value) {
+    return This->lpVtbl->get_ManifestLanguages(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Globalization
+#define IID_IApplicationLanguagesStatics IID___x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics
+#define IApplicationLanguagesStaticsVtbl __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStaticsVtbl
+#define IApplicationLanguagesStatics __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics
+#define IApplicationLanguagesStatics_QueryInterface __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_QueryInterface
+#define IApplicationLanguagesStatics_AddRef __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_AddRef
+#define IApplicationLanguagesStatics_Release __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_Release
+#define IApplicationLanguagesStatics_GetIids __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_GetIids
+#define IApplicationLanguagesStatics_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_GetRuntimeClassName
+#define IApplicationLanguagesStatics_GetTrustLevel __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_GetTrustLevel
+#define IApplicationLanguagesStatics_get_PrimaryLanguageOverride __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_get_PrimaryLanguageOverride
+#define IApplicationLanguagesStatics_put_PrimaryLanguageOverride __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_put_PrimaryLanguageOverride
+#define IApplicationLanguagesStatics_get_Languages __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_get_Languages
+#define IApplicationLanguagesStatics_get_ManifestLanguages __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_get_ManifestLanguages
+#endif /* WIDL_using_Windows_Globalization */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IApplicationLanguagesStatics2 interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
+#ifndef ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2, 0x1df0de4f, 0x072b, 0x4d7b, 0x8f,0x06, 0xcb,0x2d,0xb4,0x0f,0x2b,0xb5);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Globalization {
+            MIDL_INTERFACE("1df0de4f-072b-4d7b-8f06-cb2db40f2bb5")
+            IApplicationLanguagesStatics2 : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE GetLanguagesForUser(
+                    ABI::Windows::System::IUser *user,
+                    ABI::Windows::Foundation::Collections::IVectorView<HSTRING > **value) = 0;
+
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2, 0x1df0de4f, 0x072b, 0x4d7b, 0x8f,0x06, 0xcb,0x2d,0xb4,0x0f,0x2b,0xb5)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 *This,
+        TrustLevel *trustLevel);
+
+    /*** IApplicationLanguagesStatics2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetLanguagesForUser)(
+        __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 *This,
+        __x_ABI_CWindows_CSystem_CIUser *user,
+        __FIVectorView_1_HSTRING **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2Vtbl;
+
+interface __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2 {
+    CONST_VTBL __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IApplicationLanguagesStatics2 methods ***/
+#define __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetLanguagesForUser(This,user,value) (This)->lpVtbl->GetLanguagesForUser(This,user,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_QueryInterface(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_AddRef(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_Release(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetIids(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IApplicationLanguagesStatics2 methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetLanguagesForUser(__x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2* This,__x_ABI_CWindows_CSystem_CIUser *user,__FIVectorView_1_HSTRING **value) {
+    return This->lpVtbl->GetLanguagesForUser(This,user,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Globalization
+#define IID_IApplicationLanguagesStatics2 IID___x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2
+#define IApplicationLanguagesStatics2Vtbl __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2Vtbl
+#define IApplicationLanguagesStatics2 __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2
+#define IApplicationLanguagesStatics2_QueryInterface __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_QueryInterface
+#define IApplicationLanguagesStatics2_AddRef __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_AddRef
+#define IApplicationLanguagesStatics2_Release __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_Release
+#define IApplicationLanguagesStatics2_GetIids __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetIids
+#define IApplicationLanguagesStatics2_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetRuntimeClassName
+#define IApplicationLanguagesStatics2_GetTrustLevel __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetTrustLevel
+#define IApplicationLanguagesStatics2_GetLanguagesForUser __x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_GetLanguagesForUser
+#endif /* WIDL_using_Windows_Globalization */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CGlobalization_CIApplicationLanguagesStatics2_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */
+
+/*****************************************************************************
  * ILanguage interface
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
@@ -3969,6 +4335,22 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*
+ * Class Windows.Globalization.ApplicationLanguages
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Globalization_ApplicationLanguages_DEFINED
+#define RUNTIMECLASS_Windows_Globalization_ApplicationLanguages_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Globalization_ApplicationLanguages[] = {'W','i','n','d','o','w','s','.','G','l','o','b','a','l','i','z','a','t','i','o','n','.','A','p','p','l','i','c','a','t','i','o','n','L','a','n','g','u','a','g','e','s',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Globalization_ApplicationLanguages[] = L"Windows.Globalization.ApplicationLanguages";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Globalization_ApplicationLanguages[] = {'W','i','n','d','o','w','s','.','G','l','o','b','a','l','i','z','a','t','i','o','n','.','A','p','p','l','i','c','a','t','i','o','n','L','a','n','g','u','a','g','e','s',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Globalization_ApplicationLanguages_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
  * Class Windows.Globalization.Language
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
diff --git a/mingw-w64-headers/include/windows.globalization.idl b/mingw-w64-headers/include/windows.globalization.idl
index 382cb4d..7282af6 100644
--- a/mingw-w64-headers/include/windows.globalization.idl
+++ b/mingw-w64-headers/include/windows.globalization.idl
@@ -26,12 +26,15 @@
 import "eventtoken.idl";
 import "windowscontracts.idl";
 import "windows.foundation.idl";
+import "windows.system.idl";
 #endif
 
 namespace Windows {
     namespace Globalization {
         typedef enum DayOfWeek DayOfWeek;
         typedef enum LanguageLayoutDirection LanguageLayoutDirection;
+        interface IApplicationLanguagesStatics;
+        interface IApplicationLanguagesStatics2;
         interface ICalendar;
         interface ICalendarFactory;
         interface ICalendarFactory2;
@@ -47,6 +50,7 @@
         interface IGeographicRegionFactory;
         interface IGeographicRegionStatics;
         interface ITimeZoneOnCalendar;
+        runtimeclass ApplicationLanguages;
         runtimeclass Calendar;
         runtimeclass Language;
         runtimeclass GeographicRegion;
@@ -229,6 +233,29 @@
 
         [
             contract(Windows.Foundation.UniversalApiContract, 1.0),
+            exclusiveto(Windows.Globalization.ApplicationLanguages),
+            uuid(75b40847-0a4c-4a92-9565-fd63c95f7aed)
+        ]
+        interface IApplicationLanguagesStatics : IInspectable
+        {
+            [propget] HRESULT PrimaryLanguageOverride([out, retval] HSTRING *value);
+            [propput] HRESULT PrimaryLanguageOverride([in] HSTRING value);
+            [propget] HRESULT Languages([out, retval] Windows.Foundation.Collections.IVectorView<HSTRING> **value);
+            [propget] HRESULT ManifestLanguages([out, retval] Windows.Foundation.Collections.IVectorView<HSTRING> **value);
+        }
+
+        [
+            contract(Windows.Foundation.UniversalApiContract, 6.0),
+            exclusiveto(Windows.Globalization.ApplicationLanguages),
+            uuid(1df0de4f-072b-4d7b-8f06-cb2db40f2bb5)
+        ]
+        interface IApplicationLanguagesStatics2 : IInspectable
+        {
+            HRESULT GetLanguagesForUser([in] Windows.System.User *user, [out, retval] Windows.Foundation.Collections.IVectorView<HSTRING> **value);
+        }
+
+        [
+            contract(Windows.Foundation.UniversalApiContract, 1.0),
             exclusiveto(Windows.Globalization.Language),
             uuid(ea79a752-f7c2-4265-b1bd-c4dec4e4f080)
         ]
@@ -375,6 +402,17 @@
         }
 
         [
+            contract(Windows.Foundation.UniversalApiContract, 1.0),
+            marshaling_behavior(agile),
+            static(Windows.Globalization.IApplicationLanguagesStatics, Windows.Foundation.UniversalApiContract, 1.0),
+            static(Windows.Globalization.IApplicationLanguagesStatics2, Windows.Foundation.UniversalApiContract, 6.0),
+            threading(both)
+        ]
+        runtimeclass ApplicationLanguages
+        {
+        }
+
+        [
             activatable(Windows.Globalization.ILanguageFactory, Windows.Foundation.UniversalApiContract, 1.0),
             contract(Windows.Foundation.UniversalApiContract, 1.0),
             marshaling_behavior(agile),
diff --git a/mingw-w64-headers/include/windows.media.h b/mingw-w64-headers/include/windows.media.h
index 611ab10..4d65867 100644
--- a/mingw-w64-headers/include/windows.media.h
+++ b/mingw-w64-headers/include/windows.media.h
@@ -26,6 +26,21 @@
 
 /* Forward declarations */
 
+#ifndef ____x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs ABI::Windows::Media::IAutoRepeatModeChangeRequestedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface IAutoRepeatModeChangeRequestedEventArgs;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CMedia_CIMediaMarker_FWD_DEFINED__
 #define ____x_ABI_CWindows_CMedia_CIMediaMarker_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CMedia_CIMediaMarker __x_ABI_CWindows_CMedia_CIMediaMarker;
@@ -71,6 +86,51 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs ABI::Windows::Media::IPlaybackPositionChangeRequestedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface IPlaybackPositionChangeRequestedEventArgs;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs ABI::Windows::Media::IPlaybackRateChangeRequestedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface IPlaybackRateChangeRequestedEventArgs;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs ABI::Windows::Media::IShuffleEnabledChangeRequestedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface IShuffleEnabledChangeRequestedEventArgs;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CMedia_CISystemMediaTransportControls_FWD_DEFINED__
 #define ____x_ABI_CWindows_CMedia_CISystemMediaTransportControls_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CMedia_CISystemMediaTransportControls __x_ABI_CWindows_CMedia_CISystemMediaTransportControls;
@@ -86,6 +146,21 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 ABI::Windows::Media::ISystemMediaTransportControls2
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface ISystemMediaTransportControls2;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CMedia_CISystemMediaTransportControlsDisplayUpdater_FWD_DEFINED__
 #define ____x_ABI_CWindows_CMedia_CISystemMediaTransportControlsDisplayUpdater_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsDisplayUpdater __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsDisplayUpdater;
@@ -131,6 +206,36 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties ABI::Windows::Media::ISystemMediaTransportControlsTimelineProperties
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface ISystemMediaTransportControlsTimelineProperties;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CAutoRepeatModeChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CAutoRepeatModeChangeRequestedEventArgs_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            class AutoRepeatModeChangeRequestedEventArgs;
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CMedia_CAutoRepeatModeChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CAutoRepeatModeChangeRequestedEventArgs;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CMedia_CAutoRepeatModeChangeRequestedEventArgs_FWD_DEFINED__ */
+
 #ifndef ____x_ABI_CWindows_CMedia_CImageDisplayProperties_FWD_DEFINED__
 #define ____x_ABI_CWindows_CMedia_CImageDisplayProperties_FWD_DEFINED__
 #ifdef __cplusplus
@@ -161,6 +266,51 @@
 #endif /* defined __cplusplus */
 #endif /* defined ____x_ABI_CWindows_CMedia_CMusicDisplayProperties_FWD_DEFINED__ */
 
+#ifndef ____x_ABI_CWindows_CMedia_CPlaybackPositionChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CPlaybackPositionChangeRequestedEventArgs_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            class PlaybackPositionChangeRequestedEventArgs;
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CMedia_CPlaybackPositionChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CPlaybackPositionChangeRequestedEventArgs;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CMedia_CPlaybackPositionChangeRequestedEventArgs_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CMedia_CPlaybackRateChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CPlaybackRateChangeRequestedEventArgs_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            class PlaybackRateChangeRequestedEventArgs;
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CMedia_CPlaybackRateChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CPlaybackRateChangeRequestedEventArgs;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CMedia_CPlaybackRateChangeRequestedEventArgs_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CMedia_CShuffleEnabledChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CShuffleEnabledChangeRequestedEventArgs_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            class ShuffleEnabledChangeRequestedEventArgs;
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CMedia_CShuffleEnabledChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CShuffleEnabledChangeRequestedEventArgs;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CMedia_CShuffleEnabledChangeRequestedEventArgs_FWD_DEFINED__ */
+
 #ifndef ____x_ABI_CWindows_CMedia_CSystemMediaTransportControls_FWD_DEFINED__
 #define ____x_ABI_CWindows_CMedia_CSystemMediaTransportControls_FWD_DEFINED__
 #ifdef __cplusplus
@@ -221,6 +371,21 @@
 #endif /* defined __cplusplus */
 #endif /* defined ____x_ABI_CWindows_CMedia_CSystemMediaTransportControlsPropertyChangedEventArgs_FWD_DEFINED__ */
 
+#ifndef ____x_ABI_CWindows_CMedia_CSystemMediaTransportControlsTimelineProperties_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CSystemMediaTransportControlsTimelineProperties_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            class SystemMediaTransportControlsTimelineProperties;
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CMedia_CSystemMediaTransportControlsTimelineProperties __x_ABI_CWindows_CMedia_CSystemMediaTransportControlsTimelineProperties;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CMedia_CSystemMediaTransportControlsTimelineProperties_FWD_DEFINED__ */
+
 #ifndef ____x_ABI_CWindows_CMedia_CVideoDisplayProperties_FWD_DEFINED__
 #define ____x_ABI_CWindows_CMedia_CVideoDisplayProperties_FWD_DEFINED__
 #ifdef __cplusplus
@@ -268,6 +433,46 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIReference_1_MediaPlaybackAutoRepeatMode_FWD_DEFINED__
+#define ____FIReference_1_MediaPlaybackAutoRepeatMode_FWD_DEFINED__
+typedef interface __FIReference_1_MediaPlaybackAutoRepeatMode __FIReference_1_MediaPlaybackAutoRepeatMode;
+#ifdef __cplusplus
+#define __FIReference_1_MediaPlaybackAutoRepeatMode ABI::Windows::Foundation::IReference<ABI::Windows::Media::MediaPlaybackAutoRepeatMode >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_FWD_DEFINED__
+#define ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::AutoRepeatModeChangeRequestedEventArgs* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_FWD_DEFINED__
+#define ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackPositionChangeRequestedEventArgs* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_FWD_DEFINED__
+#define ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackRateChangeRequestedEventArgs* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_FWD_DEFINED__
+#define ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::ShuffleEnabledChangeRequestedEventArgs* >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CSystemMediaTransportControlsButtonPressedEventArgs_FWD_DEFINED__
 #define ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CSystemMediaTransportControlsButtonPressedEventArgs_FWD_DEFINED__
 typedef interface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CSystemMediaTransportControlsButtonPressedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CSystemMediaTransportControlsButtonPressedEventArgs;
@@ -300,6 +505,10 @@
 #endif /* __cplusplus */
 
 #ifndef __cplusplus
+typedef enum __x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode __x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode;
+#endif /* __cplusplus */
+
+#ifndef __cplusplus
 typedef enum __x_ABI_CWindows_CMedia_CMediaPlaybackStatus __x_ABI_CWindows_CMedia_CMediaPlaybackStatus;
 #endif /* __cplusplus */
 
@@ -319,6 +528,21 @@
 typedef enum __x_ABI_CWindows_CMedia_CSystemMediaTransportControlsProperty __x_ABI_CWindows_CMedia_CSystemMediaTransportControlsProperty;
 #endif /* __cplusplus */
 
+#ifndef ____x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs ABI::Windows::Media::IAutoRepeatModeChangeRequestedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface IAutoRepeatModeChangeRequestedEventArgs;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CMedia_CIImageDisplayProperties_FWD_DEFINED__
 #define ____x_ABI_CWindows_CMedia_CIImageDisplayProperties_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CMedia_CIImageDisplayProperties __x_ABI_CWindows_CMedia_CIImageDisplayProperties;
@@ -409,6 +633,51 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs ABI::Windows::Media::IPlaybackPositionChangeRequestedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface IPlaybackPositionChangeRequestedEventArgs;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs ABI::Windows::Media::IPlaybackRateChangeRequestedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface IPlaybackRateChangeRequestedEventArgs;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs ABI::Windows::Media::IShuffleEnabledChangeRequestedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface IShuffleEnabledChangeRequestedEventArgs;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CMedia_CISystemMediaTransportControls_FWD_DEFINED__
 #define ____x_ABI_CWindows_CMedia_CISystemMediaTransportControls_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CMedia_CISystemMediaTransportControls __x_ABI_CWindows_CMedia_CISystemMediaTransportControls;
@@ -499,6 +768,21 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_FWD_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties ABI::Windows::Media::ISystemMediaTransportControlsTimelineProperties
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            interface ISystemMediaTransportControlsTimelineProperties;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CMedia_CIVideoDisplayProperties_FWD_DEFINED__
 #define ____x_ABI_CWindows_CMedia_CIVideoDisplayProperties_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CMedia_CIVideoDisplayProperties __x_ABI_CWindows_CMedia_CIVideoDisplayProperties;
@@ -561,6 +845,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIReference_1_MediaPlaybackAutoRepeatMode_FWD_DEFINED__
+#define ____FIReference_1_MediaPlaybackAutoRepeatMode_FWD_DEFINED__
+typedef interface __FIReference_1_MediaPlaybackAutoRepeatMode __FIReference_1_MediaPlaybackAutoRepeatMode;
+#ifdef __cplusplus
+#define __FIReference_1_MediaPlaybackAutoRepeatMode ABI::Windows::Foundation::IReference<ABI::Windows::Media::MediaPlaybackAutoRepeatMode >
+#endif /* __cplusplus */
+#endif
+
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
 #ifdef __cplusplus
 } /* extern "C" */
@@ -592,6 +884,33 @@
 namespace ABI {
     namespace Windows {
         namespace Media {
+            enum MediaPlaybackAutoRepeatMode {
+                MediaPlaybackAutoRepeatMode_None = 0,
+                MediaPlaybackAutoRepeatMode_Track = 1,
+                MediaPlaybackAutoRepeatMode_List = 2
+            };
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode {
+    MediaPlaybackAutoRepeatMode_None = 0,
+    MediaPlaybackAutoRepeatMode_Track = 1,
+    MediaPlaybackAutoRepeatMode_List = 2
+};
+#ifdef WIDL_using_Windows_Media
+#define MediaPlaybackAutoRepeatMode __x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode
+#endif /* WIDL_using_Windows_Media */
+#endif
+
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Media {
             enum MediaPlaybackStatus {
                 MediaPlaybackStatus_Closed = 0,
                 MediaPlaybackStatus_Changing = 1,
@@ -738,6 +1057,132 @@
 
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 /*****************************************************************************
+ * IAutoRepeatModeChangeRequestedEventArgs interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs, 0xea137efa, 0xd852, 0x438e, 0x88,0x2b, 0xc9,0x90,0x10,0x9a,0x78,0xf4);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            MIDL_INTERFACE("ea137efa-d852-438e-882b-c990109a78f4")
+            IAutoRepeatModeChangeRequestedEventArgs : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_RequestedAutoRepeatMode(
+                    ABI::Windows::Media::MediaPlaybackAutoRepeatMode *value) = 0;
+
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs, 0xea137efa, 0xd852, 0x438e, 0x88,0x2b, 0xc9,0x90,0x10,0x9a,0x78,0xf4)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs *This,
+        TrustLevel *trustLevel);
+
+    /*** IAutoRepeatModeChangeRequestedEventArgs methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_RequestedAutoRepeatMode)(
+        __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs *This,
+        __x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode *value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgsVtbl;
+
+interface __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs {
+    CONST_VTBL __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAutoRepeatModeChangeRequestedEventArgs methods ***/
+#define __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_get_RequestedAutoRepeatMode(This,value) (This)->lpVtbl->get_RequestedAutoRepeatMode(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_Release(__x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAutoRepeatModeChangeRequestedEventArgs methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_get_RequestedAutoRepeatMode(__x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs* This,__x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode *value) {
+    return This->lpVtbl->get_RequestedAutoRepeatMode(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Media
+#define IID_IAutoRepeatModeChangeRequestedEventArgs IID___x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs
+#define IAutoRepeatModeChangeRequestedEventArgsVtbl __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgsVtbl
+#define IAutoRepeatModeChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs
+#define IAutoRepeatModeChangeRequestedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_QueryInterface
+#define IAutoRepeatModeChangeRequestedEventArgs_AddRef __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_AddRef
+#define IAutoRepeatModeChangeRequestedEventArgs_Release __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_Release
+#define IAutoRepeatModeChangeRequestedEventArgs_GetIids __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_GetIids
+#define IAutoRepeatModeChangeRequestedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_GetRuntimeClassName
+#define IAutoRepeatModeChangeRequestedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_GetTrustLevel
+#define IAutoRepeatModeChangeRequestedEventArgs_get_RequestedAutoRepeatMode __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_get_RequestedAutoRepeatMode
+#endif /* WIDL_using_Windows_Media */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
  * IMediaMarker interface
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
@@ -1248,6 +1693,384 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*****************************************************************************
+ * IPlaybackPositionChangeRequestedEventArgs interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs, 0xb4493f88, 0xeb28, 0x4961, 0x9c,0x14, 0x33,0x5e,0x44,0xf3,0xe1,0x25);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            MIDL_INTERFACE("b4493f88-eb28-4961-9c14-335e44f3e125")
+            IPlaybackPositionChangeRequestedEventArgs : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_RequestedPlaybackPosition(
+                    ABI::Windows::Foundation::TimeSpan *value) = 0;
+
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs, 0xb4493f88, 0xeb28, 0x4961, 0x9c,0x14, 0x33,0x5e,0x44,0xf3,0xe1,0x25)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs *This,
+        TrustLevel *trustLevel);
+
+    /*** IPlaybackPositionChangeRequestedEventArgs methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_RequestedPlaybackPosition)(
+        __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan *value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgsVtbl;
+
+interface __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs {
+    CONST_VTBL __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IPlaybackPositionChangeRequestedEventArgs methods ***/
+#define __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_get_RequestedPlaybackPosition(This,value) (This)->lpVtbl->get_RequestedPlaybackPosition(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_Release(__x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IPlaybackPositionChangeRequestedEventArgs methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_get_RequestedPlaybackPosition(__x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
+    return This->lpVtbl->get_RequestedPlaybackPosition(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Media
+#define IID_IPlaybackPositionChangeRequestedEventArgs IID___x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs
+#define IPlaybackPositionChangeRequestedEventArgsVtbl __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgsVtbl
+#define IPlaybackPositionChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs
+#define IPlaybackPositionChangeRequestedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_QueryInterface
+#define IPlaybackPositionChangeRequestedEventArgs_AddRef __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_AddRef
+#define IPlaybackPositionChangeRequestedEventArgs_Release __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_Release
+#define IPlaybackPositionChangeRequestedEventArgs_GetIids __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_GetIids
+#define IPlaybackPositionChangeRequestedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_GetRuntimeClassName
+#define IPlaybackPositionChangeRequestedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_GetTrustLevel
+#define IPlaybackPositionChangeRequestedEventArgs_get_RequestedPlaybackPosition __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_get_RequestedPlaybackPosition
+#endif /* WIDL_using_Windows_Media */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IPlaybackRateChangeRequestedEventArgs interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs, 0x2ce2c41f, 0x3cd6, 0x4f77, 0x9b,0xa7, 0xeb,0x27,0xc2,0x6a,0x21,0x40);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            MIDL_INTERFACE("2ce2c41f-3cd6-4f77-9ba7-eb27c26a2140")
+            IPlaybackRateChangeRequestedEventArgs : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_RequestedPlaybackRate(
+                    DOUBLE *value) = 0;
+
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs, 0x2ce2c41f, 0x3cd6, 0x4f77, 0x9b,0xa7, 0xeb,0x27,0xc2,0x6a,0x21,0x40)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs *This,
+        TrustLevel *trustLevel);
+
+    /*** IPlaybackRateChangeRequestedEventArgs methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_RequestedPlaybackRate)(
+        __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs *This,
+        DOUBLE *value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgsVtbl;
+
+interface __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs {
+    CONST_VTBL __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IPlaybackRateChangeRequestedEventArgs methods ***/
+#define __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_get_RequestedPlaybackRate(This,value) (This)->lpVtbl->get_RequestedPlaybackRate(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_Release(__x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IPlaybackRateChangeRequestedEventArgs methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_get_RequestedPlaybackRate(__x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs* This,DOUBLE *value) {
+    return This->lpVtbl->get_RequestedPlaybackRate(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Media
+#define IID_IPlaybackRateChangeRequestedEventArgs IID___x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs
+#define IPlaybackRateChangeRequestedEventArgsVtbl __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgsVtbl
+#define IPlaybackRateChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs
+#define IPlaybackRateChangeRequestedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_QueryInterface
+#define IPlaybackRateChangeRequestedEventArgs_AddRef __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_AddRef
+#define IPlaybackRateChangeRequestedEventArgs_Release __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_Release
+#define IPlaybackRateChangeRequestedEventArgs_GetIids __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_GetIids
+#define IPlaybackRateChangeRequestedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_GetRuntimeClassName
+#define IPlaybackRateChangeRequestedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_GetTrustLevel
+#define IPlaybackRateChangeRequestedEventArgs_get_RequestedPlaybackRate __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_get_RequestedPlaybackRate
+#endif /* WIDL_using_Windows_Media */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IShuffleEnabledChangeRequestedEventArgs interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs, 0x49b593fe, 0x4fd0, 0x4666, 0xa3,0x14, 0xc0,0xe0,0x19,0x40,0xd3,0x02);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            MIDL_INTERFACE("49b593fe-4fd0-4666-a314-c0e01940d302")
+            IShuffleEnabledChangeRequestedEventArgs : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_RequestedShuffleEnabled(
+                    boolean *value) = 0;
+
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs, 0x49b593fe, 0x4fd0, 0x4666, 0xa3,0x14, 0xc0,0xe0,0x19,0x40,0xd3,0x02)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs *This,
+        TrustLevel *trustLevel);
+
+    /*** IShuffleEnabledChangeRequestedEventArgs methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_RequestedShuffleEnabled)(
+        __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs *This,
+        boolean *value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgsVtbl;
+
+interface __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs {
+    CONST_VTBL __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IShuffleEnabledChangeRequestedEventArgs methods ***/
+#define __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_get_RequestedShuffleEnabled(This,value) (This)->lpVtbl->get_RequestedShuffleEnabled(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_Release(__x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IShuffleEnabledChangeRequestedEventArgs methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_get_RequestedShuffleEnabled(__x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs* This,boolean *value) {
+    return This->lpVtbl->get_RequestedShuffleEnabled(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Media
+#define IID_IShuffleEnabledChangeRequestedEventArgs IID___x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs
+#define IShuffleEnabledChangeRequestedEventArgsVtbl __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgsVtbl
+#define IShuffleEnabledChangeRequestedEventArgs __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs
+#define IShuffleEnabledChangeRequestedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_QueryInterface
+#define IShuffleEnabledChangeRequestedEventArgs_AddRef __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_AddRef
+#define IShuffleEnabledChangeRequestedEventArgs_Release __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_Release
+#define IShuffleEnabledChangeRequestedEventArgs_GetIids __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_GetIids
+#define IShuffleEnabledChangeRequestedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_GetRuntimeClassName
+#define IShuffleEnabledChangeRequestedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_GetTrustLevel
+#define IShuffleEnabledChangeRequestedEventArgs_get_RequestedShuffleEnabled __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_get_RequestedShuffleEnabled
+#endif /* WIDL_using_Windows_Media */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
  * ISystemMediaTransportControls interface
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
@@ -1726,6 +2549,308 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*****************************************************************************
+ * ISystemMediaTransportControls2 interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CISystemMediaTransportControls2, 0xea98d2f6, 0x7f3c, 0x4af2, 0xa5,0x86, 0x72,0x88,0x98,0x08,0xef,0xb1);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            MIDL_INTERFACE("ea98d2f6-7f3c-4af2-a586-72889808efb1")
+            ISystemMediaTransportControls2 : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_AutoRepeatMode(
+                    ABI::Windows::Media::MediaPlaybackAutoRepeatMode *value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE put_AutoRepeatMode(
+                    ABI::Windows::Media::MediaPlaybackAutoRepeatMode value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE get_ShuffleEnabled(
+                    boolean *value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE put_ShuffleEnabled(
+                    boolean value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE get_PlaybackRate(
+                    DOUBLE *value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE put_PlaybackRate(
+                    DOUBLE value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE UpdateTimelineProperties(
+                    ABI::Windows::Media::ISystemMediaTransportControlsTimelineProperties *timeline_properties) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE add_PlaybackPositionChangeRequested(
+                    ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackPositionChangeRequestedEventArgs* > *handler,
+                    EventRegistrationToken *token) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE remove_PlaybackPositionChangeRequested(
+                    EventRegistrationToken token) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE add_PlaybackRateChangeRequested(
+                    ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackRateChangeRequestedEventArgs* > *handler,
+                    EventRegistrationToken *token) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE remove_PlaybackRateChangeRequested(
+                    EventRegistrationToken token) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE add_ShuffleEnabledChangeRequested(
+                    ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::ShuffleEnabledChangeRequestedEventArgs* > *handler,
+                    EventRegistrationToken *token) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE remove_ShuffleEnabledChangeRequested(
+                    EventRegistrationToken token) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE add_AutoRepeatModeChangeRequested(
+                    ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::AutoRepeatModeChangeRequestedEventArgs* > *handler,
+                    EventRegistrationToken *token) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE remove_AutoRepeatModeChangeRequested(
+                    EventRegistrationToken token) = 0;
+
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2, 0xea98d2f6, 0x7f3c, 0x4af2, 0xa5,0x86, 0x72,0x88,0x98,0x08,0xef,0xb1)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        TrustLevel *trustLevel);
+
+    /*** ISystemMediaTransportControls2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_AutoRepeatMode)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        __x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_AutoRepeatMode)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        __x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode value);
+
+    HRESULT (STDMETHODCALLTYPE *get_ShuffleEnabled)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_ShuffleEnabled)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        boolean value);
+
+    HRESULT (STDMETHODCALLTYPE *get_PlaybackRate)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        DOUBLE *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_PlaybackRate)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        DOUBLE value);
+
+    HRESULT (STDMETHODCALLTYPE *UpdateTimelineProperties)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *timeline_properties);
+
+    HRESULT (STDMETHODCALLTYPE *add_PlaybackPositionChangeRequested)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs *handler,
+        EventRegistrationToken *token);
+
+    HRESULT (STDMETHODCALLTYPE *remove_PlaybackPositionChangeRequested)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        EventRegistrationToken token);
+
+    HRESULT (STDMETHODCALLTYPE *add_PlaybackRateChangeRequested)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs *handler,
+        EventRegistrationToken *token);
+
+    HRESULT (STDMETHODCALLTYPE *remove_PlaybackRateChangeRequested)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        EventRegistrationToken token);
+
+    HRESULT (STDMETHODCALLTYPE *add_ShuffleEnabledChangeRequested)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs *handler,
+        EventRegistrationToken *token);
+
+    HRESULT (STDMETHODCALLTYPE *remove_ShuffleEnabledChangeRequested)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        EventRegistrationToken token);
+
+    HRESULT (STDMETHODCALLTYPE *add_AutoRepeatModeChangeRequested)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs *handler,
+        EventRegistrationToken *token);
+
+    HRESULT (STDMETHODCALLTYPE *remove_AutoRepeatModeChangeRequested)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 *This,
+        EventRegistrationToken token);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2Vtbl;
+
+interface __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2 {
+    CONST_VTBL __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** ISystemMediaTransportControls2 methods ***/
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_get_AutoRepeatMode(This,value) (This)->lpVtbl->get_AutoRepeatMode(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_put_AutoRepeatMode(This,value) (This)->lpVtbl->put_AutoRepeatMode(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_get_ShuffleEnabled(This,value) (This)->lpVtbl->get_ShuffleEnabled(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_put_ShuffleEnabled(This,value) (This)->lpVtbl->put_ShuffleEnabled(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_get_PlaybackRate(This,value) (This)->lpVtbl->get_PlaybackRate(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_put_PlaybackRate(This,value) (This)->lpVtbl->put_PlaybackRate(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_UpdateTimelineProperties(This,timeline_properties) (This)->lpVtbl->UpdateTimelineProperties(This,timeline_properties)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_PlaybackPositionChangeRequested(This,handler,token) (This)->lpVtbl->add_PlaybackPositionChangeRequested(This,handler,token)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_PlaybackPositionChangeRequested(This,token) (This)->lpVtbl->remove_PlaybackPositionChangeRequested(This,token)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_PlaybackRateChangeRequested(This,handler,token) (This)->lpVtbl->add_PlaybackRateChangeRequested(This,handler,token)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_PlaybackRateChangeRequested(This,token) (This)->lpVtbl->remove_PlaybackRateChangeRequested(This,token)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_ShuffleEnabledChangeRequested(This,handler,token) (This)->lpVtbl->add_ShuffleEnabledChangeRequested(This,handler,token)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_ShuffleEnabledChangeRequested(This,token) (This)->lpVtbl->remove_ShuffleEnabledChangeRequested(This,token)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_AutoRepeatModeChangeRequested(This,handler,token) (This)->lpVtbl->add_AutoRepeatModeChangeRequested(This,handler,token)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_AutoRepeatModeChangeRequested(This,token) (This)->lpVtbl->remove_AutoRepeatModeChangeRequested(This,token)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_QueryInterface(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_AddRef(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_Release(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_GetIids(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_GetTrustLevel(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** ISystemMediaTransportControls2 methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_get_AutoRepeatMode(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,__x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode *value) {
+    return This->lpVtbl->get_AutoRepeatMode(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_put_AutoRepeatMode(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,__x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode value) {
+    return This->lpVtbl->put_AutoRepeatMode(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_get_ShuffleEnabled(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,boolean *value) {
+    return This->lpVtbl->get_ShuffleEnabled(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_put_ShuffleEnabled(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,boolean value) {
+    return This->lpVtbl->put_ShuffleEnabled(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_get_PlaybackRate(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,DOUBLE *value) {
+    return This->lpVtbl->get_PlaybackRate(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_put_PlaybackRate(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,DOUBLE value) {
+    return This->lpVtbl->put_PlaybackRate(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_UpdateTimelineProperties(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *timeline_properties) {
+    return This->lpVtbl->UpdateTimelineProperties(This,timeline_properties);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_PlaybackPositionChangeRequested(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs *handler,EventRegistrationToken *token) {
+    return This->lpVtbl->add_PlaybackPositionChangeRequested(This,handler,token);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_PlaybackPositionChangeRequested(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,EventRegistrationToken token) {
+    return This->lpVtbl->remove_PlaybackPositionChangeRequested(This,token);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_PlaybackRateChangeRequested(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs *handler,EventRegistrationToken *token) {
+    return This->lpVtbl->add_PlaybackRateChangeRequested(This,handler,token);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_PlaybackRateChangeRequested(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,EventRegistrationToken token) {
+    return This->lpVtbl->remove_PlaybackRateChangeRequested(This,token);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_ShuffleEnabledChangeRequested(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs *handler,EventRegistrationToken *token) {
+    return This->lpVtbl->add_ShuffleEnabledChangeRequested(This,handler,token);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_ShuffleEnabledChangeRequested(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,EventRegistrationToken token) {
+    return This->lpVtbl->remove_ShuffleEnabledChangeRequested(This,token);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_AutoRepeatModeChangeRequested(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs *handler,EventRegistrationToken *token) {
+    return This->lpVtbl->add_AutoRepeatModeChangeRequested(This,handler,token);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_AutoRepeatModeChangeRequested(__x_ABI_CWindows_CMedia_CISystemMediaTransportControls2* This,EventRegistrationToken token) {
+    return This->lpVtbl->remove_AutoRepeatModeChangeRequested(This,token);
+}
+#endif
+#ifdef WIDL_using_Windows_Media
+#define IID_ISystemMediaTransportControls2 IID___x_ABI_CWindows_CMedia_CISystemMediaTransportControls2
+#define ISystemMediaTransportControls2Vtbl __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2Vtbl
+#define ISystemMediaTransportControls2 __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2
+#define ISystemMediaTransportControls2_QueryInterface __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_QueryInterface
+#define ISystemMediaTransportControls2_AddRef __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_AddRef
+#define ISystemMediaTransportControls2_Release __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_Release
+#define ISystemMediaTransportControls2_GetIids __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_GetIids
+#define ISystemMediaTransportControls2_GetRuntimeClassName __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_GetRuntimeClassName
+#define ISystemMediaTransportControls2_GetTrustLevel __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_GetTrustLevel
+#define ISystemMediaTransportControls2_get_AutoRepeatMode __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_get_AutoRepeatMode
+#define ISystemMediaTransportControls2_put_AutoRepeatMode __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_put_AutoRepeatMode
+#define ISystemMediaTransportControls2_get_ShuffleEnabled __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_get_ShuffleEnabled
+#define ISystemMediaTransportControls2_put_ShuffleEnabled __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_put_ShuffleEnabled
+#define ISystemMediaTransportControls2_get_PlaybackRate __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_get_PlaybackRate
+#define ISystemMediaTransportControls2_put_PlaybackRate __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_put_PlaybackRate
+#define ISystemMediaTransportControls2_UpdateTimelineProperties __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_UpdateTimelineProperties
+#define ISystemMediaTransportControls2_add_PlaybackPositionChangeRequested __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_PlaybackPositionChangeRequested
+#define ISystemMediaTransportControls2_remove_PlaybackPositionChangeRequested __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_PlaybackPositionChangeRequested
+#define ISystemMediaTransportControls2_add_PlaybackRateChangeRequested __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_PlaybackRateChangeRequested
+#define ISystemMediaTransportControls2_remove_PlaybackRateChangeRequested __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_PlaybackRateChangeRequested
+#define ISystemMediaTransportControls2_add_ShuffleEnabledChangeRequested __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_ShuffleEnabledChangeRequested
+#define ISystemMediaTransportControls2_remove_ShuffleEnabledChangeRequested __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_ShuffleEnabledChangeRequested
+#define ISystemMediaTransportControls2_add_AutoRepeatModeChangeRequested __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_add_AutoRepeatModeChangeRequested
+#define ISystemMediaTransportControls2_remove_AutoRepeatModeChangeRequested __x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_remove_AutoRepeatModeChangeRequested
+#endif /* WIDL_using_Windows_Media */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CMedia_CISystemMediaTransportControls2_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
  * ISystemMediaTransportControlsDisplayUpdater interface
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
@@ -2237,6 +3362,256 @@
 #endif  /* ____x_ABI_CWindows_CMedia_CISystemMediaTransportControlsPropertyChangedEventArgs_INTERFACE_DEFINED__ */
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
+/*****************************************************************************
+ * ISystemMediaTransportControlsTimelineProperties interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties, 0x5125316a, 0xc3a2, 0x475b, 0x85,0x07, 0x93,0x53,0x4d,0xc8,0x8f,0x15);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Media {
+            MIDL_INTERFACE("5125316a-c3a2-475b-8507-93534dc88f15")
+            ISystemMediaTransportControlsTimelineProperties : public IInspectable
+            {
+                virtual HRESULT STDMETHODCALLTYPE get_StartTime(
+                    ABI::Windows::Foundation::TimeSpan *value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE put_StartTime(
+                    ABI::Windows::Foundation::TimeSpan value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE get_EndTime(
+                    ABI::Windows::Foundation::TimeSpan *value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE put_EndTime(
+                    ABI::Windows::Foundation::TimeSpan value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE get_MinSeekTime(
+                    ABI::Windows::Foundation::TimeSpan *value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE put_MinSeekTime(
+                    ABI::Windows::Foundation::TimeSpan value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE get_MaxSeekTime(
+                    ABI::Windows::Foundation::TimeSpan *value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE put_MaxSeekTime(
+                    ABI::Windows::Foundation::TimeSpan value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE get_Position(
+                    ABI::Windows::Foundation::TimeSpan *value) = 0;
+
+                virtual HRESULT STDMETHODCALLTYPE put_Position(
+                    ABI::Windows::Foundation::TimeSpan value) = 0;
+
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties, 0x5125316a, 0xc3a2, 0x475b, 0x85,0x07, 0x93,0x53,0x4d,0xc8,0x8f,0x15)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelinePropertiesVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        TrustLevel *trustLevel);
+
+    /*** ISystemMediaTransportControlsTimelineProperties methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_StartTime)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_StartTime)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan value);
+
+    HRESULT (STDMETHODCALLTYPE *get_EndTime)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_EndTime)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan value);
+
+    HRESULT (STDMETHODCALLTYPE *get_MinSeekTime)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_MinSeekTime)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan value);
+
+    HRESULT (STDMETHODCALLTYPE *get_MaxSeekTime)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_MaxSeekTime)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Position)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_Position)(
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelinePropertiesVtbl;
+
+interface __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties {
+    CONST_VTBL __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelinePropertiesVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** ISystemMediaTransportControlsTimelineProperties methods ***/
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_StartTime(This,value) (This)->lpVtbl->get_StartTime(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_StartTime(This,value) (This)->lpVtbl->put_StartTime(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_EndTime(This,value) (This)->lpVtbl->get_EndTime(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_EndTime(This,value) (This)->lpVtbl->put_EndTime(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_MinSeekTime(This,value) (This)->lpVtbl->get_MinSeekTime(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_MinSeekTime(This,value) (This)->lpVtbl->put_MinSeekTime(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_MaxSeekTime(This,value) (This)->lpVtbl->get_MaxSeekTime(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_MaxSeekTime(This,value) (This)->lpVtbl->put_MaxSeekTime(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_Position(This,value) (This)->lpVtbl->get_Position(This,value)
+#define __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_Position(This,value) (This)->lpVtbl->put_Position(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_QueryInterface(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_AddRef(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_Release(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_GetIids(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_GetTrustLevel(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** ISystemMediaTransportControlsTimelineProperties methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_StartTime(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
+    return This->lpVtbl->get_StartTime(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_StartTime(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
+    return This->lpVtbl->put_StartTime(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_EndTime(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
+    return This->lpVtbl->get_EndTime(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_EndTime(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
+    return This->lpVtbl->put_EndTime(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_MinSeekTime(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
+    return This->lpVtbl->get_MinSeekTime(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_MinSeekTime(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
+    return This->lpVtbl->put_MinSeekTime(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_MaxSeekTime(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
+    return This->lpVtbl->get_MaxSeekTime(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_MaxSeekTime(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
+    return This->lpVtbl->put_MaxSeekTime(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_Position(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
+    return This->lpVtbl->get_Position(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_Position(__x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
+    return This->lpVtbl->put_Position(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Media
+#define IID_ISystemMediaTransportControlsTimelineProperties IID___x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties
+#define ISystemMediaTransportControlsTimelinePropertiesVtbl __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelinePropertiesVtbl
+#define ISystemMediaTransportControlsTimelineProperties __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties
+#define ISystemMediaTransportControlsTimelineProperties_QueryInterface __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_QueryInterface
+#define ISystemMediaTransportControlsTimelineProperties_AddRef __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_AddRef
+#define ISystemMediaTransportControlsTimelineProperties_Release __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_Release
+#define ISystemMediaTransportControlsTimelineProperties_GetIids __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_GetIids
+#define ISystemMediaTransportControlsTimelineProperties_GetRuntimeClassName __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_GetRuntimeClassName
+#define ISystemMediaTransportControlsTimelineProperties_GetTrustLevel __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_GetTrustLevel
+#define ISystemMediaTransportControlsTimelineProperties_get_StartTime __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_StartTime
+#define ISystemMediaTransportControlsTimelineProperties_put_StartTime __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_StartTime
+#define ISystemMediaTransportControlsTimelineProperties_get_EndTime __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_EndTime
+#define ISystemMediaTransportControlsTimelineProperties_put_EndTime __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_EndTime
+#define ISystemMediaTransportControlsTimelineProperties_get_MinSeekTime __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_MinSeekTime
+#define ISystemMediaTransportControlsTimelineProperties_put_MinSeekTime __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_MinSeekTime
+#define ISystemMediaTransportControlsTimelineProperties_get_MaxSeekTime __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_MaxSeekTime
+#define ISystemMediaTransportControlsTimelineProperties_put_MaxSeekTime __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_MaxSeekTime
+#define ISystemMediaTransportControlsTimelineProperties_get_Position __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_get_Position
+#define ISystemMediaTransportControlsTimelineProperties_put_Position __x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_put_Position
+#endif /* WIDL_using_Windows_Media */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CMedia_CISystemMediaTransportControlsTimelineProperties_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Media.AutoRepeatModeChangeRequestedEventArgs
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Media_AutoRepeatModeChangeRequestedEventArgs_DEFINED
+#define RUNTIMECLASS_Windows_Media_AutoRepeatModeChangeRequestedEventArgs_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Media_AutoRepeatModeChangeRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','A','u','t','o','R','e','p','e','a','t','M','o','d','e','C','h','a','n','g','e','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_AutoRepeatModeChangeRequestedEventArgs[] = L"Windows.Media.AutoRepeatModeChangeRequestedEventArgs";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_AutoRepeatModeChangeRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','A','u','t','o','R','e','p','e','a','t','M','o','d','e','C','h','a','n','g','e','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Media_AutoRepeatModeChangeRequestedEventArgs_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
 /*
  * Class Windows.Media.ImageDisplayProperties
  */
@@ -2270,6 +3645,54 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*
+ * Class Windows.Media.PlaybackPositionChangeRequestedEventArgs
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Media_PlaybackPositionChangeRequestedEventArgs_DEFINED
+#define RUNTIMECLASS_Windows_Media_PlaybackPositionChangeRequestedEventArgs_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Media_PlaybackPositionChangeRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','P','o','s','i','t','i','o','n','C','h','a','n','g','e','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_PlaybackPositionChangeRequestedEventArgs[] = L"Windows.Media.PlaybackPositionChangeRequestedEventArgs";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_PlaybackPositionChangeRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','P','o','s','i','t','i','o','n','C','h','a','n','g','e','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Media_PlaybackPositionChangeRequestedEventArgs_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Media.PlaybackRateChangeRequestedEventArgs
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Media_PlaybackRateChangeRequestedEventArgs_DEFINED
+#define RUNTIMECLASS_Windows_Media_PlaybackRateChangeRequestedEventArgs_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Media_PlaybackRateChangeRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','R','a','t','e','C','h','a','n','g','e','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_PlaybackRateChangeRequestedEventArgs[] = L"Windows.Media.PlaybackRateChangeRequestedEventArgs";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_PlaybackRateChangeRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','P','l','a','y','b','a','c','k','R','a','t','e','C','h','a','n','g','e','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Media_PlaybackRateChangeRequestedEventArgs_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Media.ShuffleEnabledChangeRequestedEventArgs
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Media_ShuffleEnabledChangeRequestedEventArgs_DEFINED
+#define RUNTIMECLASS_Windows_Media_ShuffleEnabledChangeRequestedEventArgs_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Media_ShuffleEnabledChangeRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','h','u','f','f','l','e','E','n','a','b','l','e','d','C','h','a','n','g','e','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_ShuffleEnabledChangeRequestedEventArgs[] = L"Windows.Media.ShuffleEnabledChangeRequestedEventArgs";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_ShuffleEnabledChangeRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','h','u','f','f','l','e','E','n','a','b','l','e','d','C','h','a','n','g','e','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Media_ShuffleEnabledChangeRequestedEventArgs_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
  * Class Windows.Media.SystemMediaTransportControls
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
@@ -2334,6 +3757,22 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*
+ * Class Windows.Media.SystemMediaTransportControlsTimelineProperties
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Media_SystemMediaTransportControlsTimelineProperties_DEFINED
+#define RUNTIMECLASS_Windows_Media_SystemMediaTransportControlsTimelineProperties_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Media_SystemMediaTransportControlsTimelineProperties[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','y','s','t','e','m','M','e','d','i','a','T','r','a','n','s','p','o','r','t','C','o','n','t','r','o','l','s','T','i','m','e','l','i','n','e','P','r','o','p','e','r','t','i','e','s',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SystemMediaTransportControlsTimelineProperties[] = L"Windows.Media.SystemMediaTransportControlsTimelineProperties";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SystemMediaTransportControlsTimelineProperties[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','y','s','t','e','m','M','e','d','i','a','T','r','a','n','s','p','o','r','t','C','o','n','t','r','o','l','s','T','i','m','e','l','i','n','e','P','r','o','p','e','r','t','i','e','s',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Media_SystemMediaTransportControlsTimelineProperties_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
  * Class Windows.Media.VideoDisplayProperties
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
@@ -3014,6 +4453,496 @@
 #endif  /* ____FIVector_1_Windows__CMedia__CIMediaMarker_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
+ * IReference<ABI::Windows::Media::MediaPlaybackAutoRepeatMode > interface
+ */
+#ifndef ____FIReference_1_MediaPlaybackAutoRepeatMode_INTERFACE_DEFINED__
+#define ____FIReference_1_MediaPlaybackAutoRepeatMode_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIReference_1_MediaPlaybackAutoRepeatMode, 0x50a7f41f, 0x58d5, 0x5c4d, 0x94,0x75, 0x8d,0xd1,0xac,0xd6,0x58,0x36);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("50a7f41f-58d5-5c4d-9475-8dd1acd65836")
+            IReference<ABI::Windows::Media::MediaPlaybackAutoRepeatMode > : IReference_impl<ABI::Windows::Media::MediaPlaybackAutoRepeatMode >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIReference_1_MediaPlaybackAutoRepeatMode, 0x50a7f41f, 0x58d5, 0x5c4d, 0x94,0x75, 0x8d,0xd1,0xac,0xd6,0x58,0x36)
+#endif
+#else
+typedef struct __FIReference_1_MediaPlaybackAutoRepeatModeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIReference_1_MediaPlaybackAutoRepeatMode *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIReference_1_MediaPlaybackAutoRepeatMode *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIReference_1_MediaPlaybackAutoRepeatMode *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIReference_1_MediaPlaybackAutoRepeatMode *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIReference_1_MediaPlaybackAutoRepeatMode *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIReference_1_MediaPlaybackAutoRepeatMode *This,
+        TrustLevel *trustLevel);
+
+    /*** IReference<ABI::Windows::Media::MediaPlaybackAutoRepeatMode > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIReference_1_MediaPlaybackAutoRepeatMode *This,
+        __x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode *value);
+
+    END_INTERFACE
+} __FIReference_1_MediaPlaybackAutoRepeatModeVtbl;
+
+interface __FIReference_1_MediaPlaybackAutoRepeatMode {
+    CONST_VTBL __FIReference_1_MediaPlaybackAutoRepeatModeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIReference_1_MediaPlaybackAutoRepeatMode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIReference_1_MediaPlaybackAutoRepeatMode_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIReference_1_MediaPlaybackAutoRepeatMode_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIReference_1_MediaPlaybackAutoRepeatMode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIReference_1_MediaPlaybackAutoRepeatMode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIReference_1_MediaPlaybackAutoRepeatMode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IReference<ABI::Windows::Media::MediaPlaybackAutoRepeatMode > methods ***/
+#define __FIReference_1_MediaPlaybackAutoRepeatMode_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_MediaPlaybackAutoRepeatMode_QueryInterface(__FIReference_1_MediaPlaybackAutoRepeatMode* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIReference_1_MediaPlaybackAutoRepeatMode_AddRef(__FIReference_1_MediaPlaybackAutoRepeatMode* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIReference_1_MediaPlaybackAutoRepeatMode_Release(__FIReference_1_MediaPlaybackAutoRepeatMode* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_MediaPlaybackAutoRepeatMode_GetIids(__FIReference_1_MediaPlaybackAutoRepeatMode* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_MediaPlaybackAutoRepeatMode_GetRuntimeClassName(__FIReference_1_MediaPlaybackAutoRepeatMode* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIReference_1_MediaPlaybackAutoRepeatMode_GetTrustLevel(__FIReference_1_MediaPlaybackAutoRepeatMode* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IReference<ABI::Windows::Media::MediaPlaybackAutoRepeatMode > methods ***/
+static __WIDL_INLINE HRESULT __FIReference_1_MediaPlaybackAutoRepeatMode_get_Value(__FIReference_1_MediaPlaybackAutoRepeatMode* This,__x_ABI_CWindows_CMedia_CMediaPlaybackAutoRepeatMode *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IReference_MediaPlaybackAutoRepeatMode IID___FIReference_1_MediaPlaybackAutoRepeatMode
+#define IReference_MediaPlaybackAutoRepeatModeVtbl __FIReference_1_MediaPlaybackAutoRepeatModeVtbl
+#define IReference_MediaPlaybackAutoRepeatMode __FIReference_1_MediaPlaybackAutoRepeatMode
+#define IReference_MediaPlaybackAutoRepeatMode_QueryInterface __FIReference_1_MediaPlaybackAutoRepeatMode_QueryInterface
+#define IReference_MediaPlaybackAutoRepeatMode_AddRef __FIReference_1_MediaPlaybackAutoRepeatMode_AddRef
+#define IReference_MediaPlaybackAutoRepeatMode_Release __FIReference_1_MediaPlaybackAutoRepeatMode_Release
+#define IReference_MediaPlaybackAutoRepeatMode_GetIids __FIReference_1_MediaPlaybackAutoRepeatMode_GetIids
+#define IReference_MediaPlaybackAutoRepeatMode_GetRuntimeClassName __FIReference_1_MediaPlaybackAutoRepeatMode_GetRuntimeClassName
+#define IReference_MediaPlaybackAutoRepeatMode_GetTrustLevel __FIReference_1_MediaPlaybackAutoRepeatMode_GetTrustLevel
+#define IReference_MediaPlaybackAutoRepeatMode_get_Value __FIReference_1_MediaPlaybackAutoRepeatMode_get_Value
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIReference_1_MediaPlaybackAutoRepeatMode_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::AutoRepeatModeChangeRequestedEventArgs* > interface
+ */
+#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_INTERFACE_DEFINED__
+#define ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs, 0xa6214bde, 0x02d5, 0x55b3, 0xab,0x0d, 0xc6,0x03,0x1b,0xe7,0x0d,0xa1);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("a6214bde-02d5-55b3-ab0d-c6031be70da1")
+            ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::AutoRepeatModeChangeRequestedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SystemMediaTransportControls*, ABI::Windows::Media::ISystemMediaTransportControls* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::AutoRepeatModeChangeRequestedEventArgs*, ABI::Windows::Media::IAutoRepeatModeChangeRequestedEventArgs* > >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs, 0xa6214bde, 0x02d5, 0x55b3, 0xab,0x0d, 0xc6,0x03,0x1b,0xe7,0x0d,0xa1)
+#endif
+#else
+typedef struct __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs *This);
+
+    /*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::AutoRepeatModeChangeRequestedEventArgs* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs *This,
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls *sender,
+        __x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs *args);
+
+    END_INTERFACE
+} __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgsVtbl;
+
+interface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs {
+    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::AutoRepeatModeChangeRequestedEventArgs* > methods ***/
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::AutoRepeatModeChangeRequestedEventArgs* > methods ***/
+static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs* This,__x_ABI_CWindows_CMedia_CISystemMediaTransportControls *sender,__x_ABI_CWindows_CMedia_CIAutoRepeatModeChangeRequestedEventArgs *args) {
+    return This->lpVtbl->Invoke(This,sender,args);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_ITypedEventHandler_SystemMediaTransportControls_AutoRepeatModeChangeRequestedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs
+#define ITypedEventHandler_SystemMediaTransportControls_AutoRepeatModeChangeRequestedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgsVtbl
+#define ITypedEventHandler_SystemMediaTransportControls_AutoRepeatModeChangeRequestedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs
+#define ITypedEventHandler_SystemMediaTransportControls_AutoRepeatModeChangeRequestedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_QueryInterface
+#define ITypedEventHandler_SystemMediaTransportControls_AutoRepeatModeChangeRequestedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_AddRef
+#define ITypedEventHandler_SystemMediaTransportControls_AutoRepeatModeChangeRequestedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_Release
+#define ITypedEventHandler_SystemMediaTransportControls_AutoRepeatModeChangeRequestedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CAutoRepeatModeChangeRequestedEventArgs_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackPositionChangeRequestedEventArgs* > interface
+ */
+#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_INTERFACE_DEFINED__
+#define ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs, 0x44e34f15, 0xbdc0, 0x50a7, 0xac,0xe4, 0x39,0xe9,0x1f,0xb7,0x53,0xf1);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("44e34f15-bdc0-50a7-ace4-39e91fb753f1")
+            ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackPositionChangeRequestedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SystemMediaTransportControls*, ABI::Windows::Media::ISystemMediaTransportControls* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::PlaybackPositionChangeRequestedEventArgs*, ABI::Windows::Media::IPlaybackPositionChangeRequestedEventArgs* > >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs, 0x44e34f15, 0xbdc0, 0x50a7, 0xac,0xe4, 0x39,0xe9,0x1f,0xb7,0x53,0xf1)
+#endif
+#else
+typedef struct __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs *This);
+
+    /*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackPositionChangeRequestedEventArgs* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs *This,
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls *sender,
+        __x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs *args);
+
+    END_INTERFACE
+} __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgsVtbl;
+
+interface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs {
+    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackPositionChangeRequestedEventArgs* > methods ***/
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackPositionChangeRequestedEventArgs* > methods ***/
+static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs* This,__x_ABI_CWindows_CMedia_CISystemMediaTransportControls *sender,__x_ABI_CWindows_CMedia_CIPlaybackPositionChangeRequestedEventArgs *args) {
+    return This->lpVtbl->Invoke(This,sender,args);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_ITypedEventHandler_SystemMediaTransportControls_PlaybackPositionChangeRequestedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackPositionChangeRequestedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgsVtbl
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackPositionChangeRequestedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackPositionChangeRequestedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_QueryInterface
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackPositionChangeRequestedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_AddRef
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackPositionChangeRequestedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_Release
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackPositionChangeRequestedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackPositionChangeRequestedEventArgs_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackRateChangeRequestedEventArgs* > interface
+ */
+#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_INTERFACE_DEFINED__
+#define ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs, 0x15eb0182, 0x6366, 0x5b9f, 0xbd,0x8c, 0x8a,0xb4,0xfa,0x9d,0x7c,0xd9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("15eb0182-6366-5b9f-bd8c-8ab4fa9d7cd9")
+            ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackRateChangeRequestedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SystemMediaTransportControls*, ABI::Windows::Media::ISystemMediaTransportControls* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::PlaybackRateChangeRequestedEventArgs*, ABI::Windows::Media::IPlaybackRateChangeRequestedEventArgs* > >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs, 0x15eb0182, 0x6366, 0x5b9f, 0xbd,0x8c, 0x8a,0xb4,0xfa,0x9d,0x7c,0xd9)
+#endif
+#else
+typedef struct __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs *This);
+
+    /*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackRateChangeRequestedEventArgs* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs *This,
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls *sender,
+        __x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs *args);
+
+    END_INTERFACE
+} __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgsVtbl;
+
+interface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs {
+    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackRateChangeRequestedEventArgs* > methods ***/
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::PlaybackRateChangeRequestedEventArgs* > methods ***/
+static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs* This,__x_ABI_CWindows_CMedia_CISystemMediaTransportControls *sender,__x_ABI_CWindows_CMedia_CIPlaybackRateChangeRequestedEventArgs *args) {
+    return This->lpVtbl->Invoke(This,sender,args);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_ITypedEventHandler_SystemMediaTransportControls_PlaybackRateChangeRequestedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackRateChangeRequestedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgsVtbl
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackRateChangeRequestedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackRateChangeRequestedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_QueryInterface
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackRateChangeRequestedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_AddRef
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackRateChangeRequestedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_Release
+#define ITypedEventHandler_SystemMediaTransportControls_PlaybackRateChangeRequestedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CPlaybackRateChangeRequestedEventArgs_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::ShuffleEnabledChangeRequestedEventArgs* > interface
+ */
+#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_INTERFACE_DEFINED__
+#define ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs, 0x17ecea80, 0x27e4, 0x5dae, 0xab,0xb4, 0xc8,0x58,0xad,0x1c,0x53,0x07);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("17ecea80-27e4-5dae-abb4-c858ad1c5307")
+            ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::ShuffleEnabledChangeRequestedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SystemMediaTransportControls*, ABI::Windows::Media::ISystemMediaTransportControls* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::ShuffleEnabledChangeRequestedEventArgs*, ABI::Windows::Media::IShuffleEnabledChangeRequestedEventArgs* > >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs, 0x17ecea80, 0x27e4, 0x5dae, 0xab,0xb4, 0xc8,0x58,0xad,0x1c,0x53,0x07)
+#endif
+#else
+typedef struct __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs *This);
+
+    /*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::ShuffleEnabledChangeRequestedEventArgs* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs *This,
+        __x_ABI_CWindows_CMedia_CISystemMediaTransportControls *sender,
+        __x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs *args);
+
+    END_INTERFACE
+} __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgsVtbl;
+
+interface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs {
+    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::ShuffleEnabledChangeRequestedEventArgs* > methods ***/
+#define __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::ShuffleEnabledChangeRequestedEventArgs* > methods ***/
+static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs* This,__x_ABI_CWindows_CMedia_CISystemMediaTransportControls *sender,__x_ABI_CWindows_CMedia_CIShuffleEnabledChangeRequestedEventArgs *args) {
+    return This->lpVtbl->Invoke(This,sender,args);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_ITypedEventHandler_SystemMediaTransportControls_ShuffleEnabledChangeRequestedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs
+#define ITypedEventHandler_SystemMediaTransportControls_ShuffleEnabledChangeRequestedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgsVtbl
+#define ITypedEventHandler_SystemMediaTransportControls_ShuffleEnabledChangeRequestedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs
+#define ITypedEventHandler_SystemMediaTransportControls_ShuffleEnabledChangeRequestedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_QueryInterface
+#define ITypedEventHandler_SystemMediaTransportControls_ShuffleEnabledChangeRequestedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_AddRef
+#define ITypedEventHandler_SystemMediaTransportControls_ShuffleEnabledChangeRequestedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_Release
+#define ITypedEventHandler_SystemMediaTransportControls_ShuffleEnabledChangeRequestedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CShuffleEnabledChangeRequestedEventArgs_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
  * ITypedEventHandler<ABI::Windows::Media::SystemMediaTransportControls*,ABI::Windows::Media::SystemMediaTransportControlsButtonPressedEventArgs* > interface
  */
 #ifndef ____FITypedEventHandler_2_Windows__CMedia__CSystemMediaTransportControls_Windows__CMedia__CSystemMediaTransportControlsButtonPressedEventArgs_INTERFACE_DEFINED__
diff --git a/mingw-w64-headers/include/windows.media.idl b/mingw-w64-headers/include/windows.media.idl
index 35aa64a..87ccc75 100644
--- a/mingw-w64-headers/include/windows.media.idl
+++ b/mingw-w64-headers/include/windows.media.idl
@@ -28,33 +28,44 @@
 namespace Windows.Media
 {
     typedef enum AudioProcessing AudioProcessing;
+    typedef enum MediaPlaybackAutoRepeatMode MediaPlaybackAutoRepeatMode;
     typedef enum MediaPlaybackStatus MediaPlaybackStatus;
     typedef enum MediaPlaybackType MediaPlaybackType;
     typedef enum SoundLevel SoundLevel;
     typedef enum SystemMediaTransportControlsButton SystemMediaTransportControlsButton;
     typedef enum SystemMediaTransportControlsProperty SystemMediaTransportControlsProperty;
 
+    interface IAutoRepeatModeChangeRequestedEventArgs;
     interface IImageDisplayProperties;
     interface IMediaControl;
     interface IMediaMarker;
     interface IMusicDisplayProperties;
     interface IMusicDisplayProperties2;
     interface IMusicDisplayProperties3;
+    interface IPlaybackPositionChangeRequestedEventArgs;
+    interface IPlaybackRateChangeRequestedEventArgs;
+    interface IShuffleEnabledChangeRequestedEventArgs;
     interface ISystemMediaTransportControls;
     interface ISystemMediaTransportControls2;
     interface ISystemMediaTransportControlsButtonPressedEventArgs;
     interface ISystemMediaTransportControlsDisplayUpdater;
     interface ISystemMediaTransportControlsPropertyChangedEventArgs;
     interface ISystemMediaTransportControlsStatics;
+    interface ISystemMediaTransportControlsTimelineProperties;
     interface IVideoDisplayProperties;
     interface IVideoDisplayProperties2;
 
+    runtimeclass AutoRepeatModeChangeRequestedEventArgs;
     runtimeclass ImageDisplayProperties;
     runtimeclass MusicDisplayProperties;
+    runtimeclass PlaybackPositionChangeRequestedEventArgs;
+    runtimeclass PlaybackRateChangeRequestedEventArgs;
+    runtimeclass ShuffleEnabledChangeRequestedEventArgs;
     runtimeclass SystemMediaTransportControls;
     runtimeclass SystemMediaTransportControlsButtonPressedEventArgs;
     runtimeclass SystemMediaTransportControlsDisplayUpdater;
     runtimeclass SystemMediaTransportControlsPropertyChangedEventArgs;
+    runtimeclass SystemMediaTransportControlsTimelineProperties;
     runtimeclass VideoDisplayProperties;
 
     declare
@@ -63,6 +74,11 @@
         interface Windows.Foundation.Collections.IIterator<Windows.Media.IMediaMarker*>;
         interface Windows.Foundation.Collections.IVectorView<Windows.Media.IMediaMarker*>;
         interface Windows.Foundation.Collections.IVector<Windows.Media.IMediaMarker*>;
+        interface Windows.Foundation.IReference<Windows.Media.MediaPlaybackAutoRepeatMode>;
+        interface Windows.Foundation.TypedEventHandler<Windows.Media.SystemMediaTransportControls*, Windows.Media.AutoRepeatModeChangeRequestedEventArgs*>;
+        interface Windows.Foundation.TypedEventHandler<Windows.Media.SystemMediaTransportControls*, Windows.Media.PlaybackPositionChangeRequestedEventArgs*>;
+        interface Windows.Foundation.TypedEventHandler<Windows.Media.SystemMediaTransportControls*, Windows.Media.PlaybackRateChangeRequestedEventArgs*>;
+        interface Windows.Foundation.TypedEventHandler<Windows.Media.SystemMediaTransportControls*, Windows.Media.ShuffleEnabledChangeRequestedEventArgs*>;
         interface Windows.Foundation.TypedEventHandler<Windows.Media.SystemMediaTransportControls*, Windows.Media.SystemMediaTransportControlsButtonPressedEventArgs*>;
         interface Windows.Foundation.TypedEventHandler<Windows.Media.SystemMediaTransportControls*, Windows.Media.SystemMediaTransportControlsPropertyChangedEventArgs*>;
     }
@@ -79,6 +95,16 @@
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0)
     ]
+    enum MediaPlaybackAutoRepeatMode
+    {
+        None  = 0,
+        Track = 1,
+        List  = 2,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
     enum MediaPlaybackStatus
     {
         Closed   = 0,
@@ -136,6 +162,16 @@
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.AutoRepeatModeChangeRequestedEventArgs),
+        uuid(ea137efa-d852-438e-882b-c990109a78f4)
+    ]
+    interface IAutoRepeatModeChangeRequestedEventArgs : IInspectable
+    {
+        [propget] HRESULT RequestedAutoRepeatMode([out, retval] Windows.Media.MediaPlaybackAutoRepeatMode *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         uuid(1803def8-dca5-4b6f-9c20-e3d3c0643625)
     ]
     interface IMediaMarker : IInspectable
@@ -176,6 +212,36 @@
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.PlaybackPositionChangeRequestedEventArgs),
+        uuid(b4493f88-eb28-4961-9c14-335e44f3e125)
+    ]
+    interface IPlaybackPositionChangeRequestedEventArgs : IInspectable
+    {
+        [propget] HRESULT RequestedPlaybackPosition([out, retval] Windows.Foundation.TimeSpan *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.PlaybackRateChangeRequestedEventArgs),
+        uuid(2ce2c41f-3cd6-4f77-9ba7-eb27c26a2140)
+    ]
+    interface IPlaybackRateChangeRequestedEventArgs : IInspectable
+    {
+        [propget] HRESULT RequestedPlaybackRate([out, retval] DOUBLE *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.ShuffleEnabledChangeRequestedEventArgs),
+        uuid(49b593fe-4fd0-4666-a314-c0e01940d302)
+    ]
+    interface IShuffleEnabledChangeRequestedEventArgs : IInspectable
+    {
+        [propget] HRESULT RequestedShuffleEnabled([out, retval] boolean *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         exclusiveto(Windows.Media.SystemMediaTransportControls),
         uuid(99fa3ff4-1742-42a6-902e-087d41f965ec)
     ]
@@ -221,6 +287,38 @@
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.SystemMediaTransportControls),
+        uuid(ea98d2f6-7f3c-4af2-a586-72889808efb1)
+    ]
+    interface ISystemMediaTransportControls2 : IInspectable
+    {
+        [propget] HRESULT AutoRepeatMode([out, retval] Windows.Media.MediaPlaybackAutoRepeatMode *value);
+        [propput] HRESULT AutoRepeatMode([in] Windows.Media.MediaPlaybackAutoRepeatMode value);
+        [propget] HRESULT ShuffleEnabled([out, retval] boolean *value);
+        [propput] HRESULT ShuffleEnabled([in] boolean value);
+        [propget] HRESULT PlaybackRate([out, retval] DOUBLE *value);
+        [propput] HRESULT PlaybackRate([in] DOUBLE value);
+        HRESULT UpdateTimelineProperties([in] Windows.Media.SystemMediaTransportControlsTimelineProperties *timeline_properties);
+        [eventadd] HRESULT PlaybackPositionChangeRequested(
+            [in] Windows.Foundation.TypedEventHandler<Windows.Media.SystemMediaTransportControls *, Windows.Media.PlaybackPositionChangeRequestedEventArgs *> *handler,
+            [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT PlaybackPositionChangeRequested([in] EventRegistrationToken token);
+        [eventadd] HRESULT PlaybackRateChangeRequested(
+            [in] Windows.Foundation.TypedEventHandler<Windows.Media.SystemMediaTransportControls *, Windows.Media.PlaybackRateChangeRequestedEventArgs *> *handler,
+            [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT PlaybackRateChangeRequested([in] EventRegistrationToken token);
+        [eventadd] HRESULT ShuffleEnabledChangeRequested(
+            [in] Windows.Foundation.TypedEventHandler<Windows.Media.SystemMediaTransportControls *, Windows.Media.ShuffleEnabledChangeRequestedEventArgs *> *handler,
+            [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT ShuffleEnabledChangeRequested([in] EventRegistrationToken token);
+        [eventadd] HRESULT AutoRepeatModeChangeRequested(
+            [in] Windows.Foundation.TypedEventHandler<Windows.Media.SystemMediaTransportControls *, Windows.Media.AutoRepeatModeChangeRequestedEventArgs *> *handler,
+            [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT AutoRepeatModeChangeRequested([in] EventRegistrationToken token);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         exclusiveto(Windows.Media.SystemMediaTransportControlsDisplayUpdater),
         uuid(8abbc53e-fa55-4ecf-ad8e-c984e5dd1550)
     ]
@@ -265,6 +363,34 @@
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.SystemMediaTransportControlsTimelineProperties),
+        uuid(5125316a-c3a2-475b-8507-93534dc88f15)
+    ]
+    interface ISystemMediaTransportControlsTimelineProperties : IInspectable
+    {
+        [propget] HRESULT StartTime([out, retval] Windows.Foundation.TimeSpan *value);
+        [propput] HRESULT StartTime([in] Windows.Foundation.TimeSpan value);
+        [propget] HRESULT EndTime([out, retval] Windows.Foundation.TimeSpan *value);
+        [propput] HRESULT EndTime([in] Windows.Foundation.TimeSpan value);
+        [propget] HRESULT MinSeekTime([out, retval] Windows.Foundation.TimeSpan *value);
+        [propput] HRESULT MinSeekTime([in] Windows.Foundation.TimeSpan value);
+        [propget] HRESULT MaxSeekTime([out, retval] Windows.Foundation.TimeSpan *value);
+        [propput] HRESULT MaxSeekTime([in] Windows.Foundation.TimeSpan value);
+        [propget] HRESULT Position([out, retval] Windows.Foundation.TimeSpan *value);
+        [propput] HRESULT Position([in] Windows.Foundation.TimeSpan value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass AutoRepeatModeChangeRequestedEventArgs
+    {
+        [default] interface Windows.Media.IAutoRepeatModeChangeRequestedEventArgs;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         threading(both)
     ]
@@ -287,6 +413,33 @@
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass PlaybackPositionChangeRequestedEventArgs
+    {
+        [default] interface Windows.Media.IPlaybackPositionChangeRequestedEventArgs;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass PlaybackRateChangeRequestedEventArgs
+    {
+        [default] interface Windows.Media.IPlaybackRateChangeRequestedEventArgs;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass ShuffleEnabledChangeRequestedEventArgs
+    {
+        [default] interface Windows.Media.IShuffleEnabledChangeRequestedEventArgs;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         static(Windows.Media.ISystemMediaTransportControlsStatics, Windows.Foundation.UniversalApiContract, 1.0),
         threading(mta)
@@ -326,6 +479,17 @@
     }
 
     [
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass SystemMediaTransportControlsTimelineProperties
+    {
+        [default] interface Windows.Media.ISystemMediaTransportControlsTimelineProperties;
+    }
+
+    [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         threading(both)
diff --git a/mingw-w64-headers/include/windows.security.authorization.appcapabilityaccess.h b/mingw-w64-headers/include/windows.security.authorization.appcapabilityaccess.h
new file mode 100644
index 0000000..93345ad
--- /dev/null
+++ b/mingw-w64-headers/include/windows.security.authorization.appcapabilityaccess.h
@@ -0,0 +1,2185 @@
+/*** Autogenerated by WIDL 9.18 from include/windows.security.authorization.appcapabilityaccess.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_security_authorization_appcapabilityaccess_h__
+#define __windows_security_authorization_appcapabilityaccess_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_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    interface IAppCapability;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability2
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    interface IAppCapability2;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapabilityAccessChangedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    interface IAppCapabilityAccessChangedEventArgs;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapabilityStatics
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    interface IAppCapabilityStatics;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapability_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapability_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    class AppCapability;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapability __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapability;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapability_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    class AppCapabilityAccessChangedEventArgs;
+                }
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessChangedEventArgs __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessChangedEventArgs;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessChangedEventArgs_FWD_DEFINED__ */
+
+#ifndef ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIMapView_2_HSTRING_AppCapabilityAccessStatus __FIMapView_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperation_1_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIAsyncOperation_1_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1_AppCapabilityAccessStatus __FIAsyncOperation_1_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
+#define ____FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
+typedef interface __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs;
+#ifdef __cplusplus
+#define __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* >
+#endif /* __cplusplus */
+#endif
+
+/* Headers for imported files */
+
+#include <inspectable.h>
+#include <asyncinfo.h>
+#include <eventtoken.h>
+#include <windowscontracts.h>
+#include <windows.foundation.h>
+#include <windows.system.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __cplusplus
+typedef enum __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus;
+#endif /* __cplusplus */
+
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    interface IAppCapability;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability2
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    interface IAppCapability2;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapabilityAccessChangedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    interface IAppCapabilityAccessChangedEventArgs;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapabilityStatics
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    interface IAppCapabilityStatics;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIMapView_2_HSTRING_AppCapabilityAccessStatus __FIMapView_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperation_1_AppCapabilityAccessStatus_FWD_DEFINED__
+#define ____FIAsyncOperation_1_AppCapabilityAccessStatus_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1_AppCapabilityAccessStatus __FIAsyncOperation_1_AppCapabilityAccessStatus;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+#endif /* __cplusplus */
+#endif
+
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    enum AppCapabilityAccessStatus {
+                        AppCapabilityAccessStatus_DeniedBySystem = 0,
+                        AppCapabilityAccessStatus_NotDeclaredByApp = 1,
+                        AppCapabilityAccessStatus_DeniedByUser = 2,
+                        AppCapabilityAccessStatus_UserPromptRequired = 3,
+                        AppCapabilityAccessStatus_Allowed = 4
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus {
+    AppCapabilityAccessStatus_DeniedBySystem = 0,
+    AppCapabilityAccessStatus_NotDeclaredByApp = 1,
+    AppCapabilityAccessStatus_DeniedByUser = 2,
+    AppCapabilityAccessStatus_UserPromptRequired = 3,
+    AppCapabilityAccessStatus_Allowed = 4
+};
+#ifdef WIDL_using_Windows_Security_Authorization_AppCapabilityAccess
+#define AppCapabilityAccessStatus __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus
+#endif /* WIDL_using_Windows_Security_Authorization_AppCapabilityAccess */
+#endif
+
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
+/*****************************************************************************
+ * IAppCapability interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability, 0x4c49d915, 0x8a2a, 0x4295, 0x94,0x37, 0x2d,0xf7,0xc3,0x96,0xaf,0xf4);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    MIDL_INTERFACE("4c49d915-8a2a-4295-9437-2df7c396aff4")
+                    IAppCapability : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_CapabilityName(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE get_User(
+                            ABI::Windows::System::IUser **value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE RequestAccessAsync(
+                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > **operation) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CheckAccess(
+                            ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus *result) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE add_AccessChanged(
+                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > *handler,
+                            EventRegistrationToken *token) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE remove_AccessChanged(
+                            EventRegistrationToken token) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability, 0x4c49d915, 0x8a2a, 0x4295, 0x94,0x37, 0x2d,0xf7,0xc3,0x96,0xaf,0xf4)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
+        TrustLevel *trustLevel);
+
+    /*** IAppCapability methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_CapabilityName)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_User)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
+        __x_ABI_CWindows_CSystem_CIUser **value);
+
+    HRESULT (STDMETHODCALLTYPE *RequestAccessAsync)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
+        __FIAsyncOperation_1_AppCapabilityAccessStatus **operation);
+
+    HRESULT (STDMETHODCALLTYPE *CheckAccess)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *result);
+
+    HRESULT (STDMETHODCALLTYPE *add_AccessChanged)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
+        __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs *handler,
+        EventRegistrationToken *token);
+
+    HRESULT (STDMETHODCALLTYPE *remove_AccessChanged)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
+        EventRegistrationToken token);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityVtbl;
+
+interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability {
+    CONST_VTBL __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAppCapability methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_CapabilityName(This,value) (This)->lpVtbl->get_CapabilityName(This,value)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_User(This,value) (This)->lpVtbl->get_User(This,value)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_RequestAccessAsync(This,operation) (This)->lpVtbl->RequestAccessAsync(This,operation)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_CheckAccess(This,result) (This)->lpVtbl->CheckAccess(This,result)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_add_AccessChanged(This,handler,token) (This)->lpVtbl->add_AccessChanged(This,handler,token)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_remove_AccessChanged(This,token) (This)->lpVtbl->remove_AccessChanged(This,token)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_QueryInterface(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_AddRef(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_Release(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetIids(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetTrustLevel(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAppCapability methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_CapabilityName(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,HSTRING *value) {
+    return This->lpVtbl->get_CapabilityName(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_User(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,__x_ABI_CWindows_CSystem_CIUser **value) {
+    return This->lpVtbl->get_User(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_RequestAccessAsync(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,__FIAsyncOperation_1_AppCapabilityAccessStatus **operation) {
+    return This->lpVtbl->RequestAccessAsync(This,operation);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_CheckAccess(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *result) {
+    return This->lpVtbl->CheckAccess(This,result);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_add_AccessChanged(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs *handler,EventRegistrationToken *token) {
+    return This->lpVtbl->add_AccessChanged(This,handler,token);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_remove_AccessChanged(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,EventRegistrationToken token) {
+    return This->lpVtbl->remove_AccessChanged(This,token);
+}
+#endif
+#ifdef WIDL_using_Windows_Security_Authorization_AppCapabilityAccess
+#define IID_IAppCapability IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability
+#define IAppCapabilityVtbl __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityVtbl
+#define IAppCapability __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability
+#define IAppCapability_QueryInterface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_QueryInterface
+#define IAppCapability_AddRef __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_AddRef
+#define IAppCapability_Release __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_Release
+#define IAppCapability_GetIids __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetIids
+#define IAppCapability_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetRuntimeClassName
+#define IAppCapability_GetTrustLevel __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetTrustLevel
+#define IAppCapability_get_CapabilityName __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_CapabilityName
+#define IAppCapability_get_User __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_User
+#define IAppCapability_RequestAccessAsync __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_RequestAccessAsync
+#define IAppCapability_CheckAccess __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_CheckAccess
+#define IAppCapability_add_AccessChanged __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_add_AccessChanged
+#define IAppCapability_remove_AccessChanged __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_remove_AccessChanged
+#endif /* WIDL_using_Windows_Security_Authorization_AppCapabilityAccess */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
+
+/*****************************************************************************
+ * IAppCapability2 interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2, 0x11c7ccb6, 0xc74f, 0x50a3, 0xb9,0x60, 0x88,0x00,0x87,0x67,0xd9,0x39);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    MIDL_INTERFACE("11c7ccb6-c74f-50a3-b960-88008767d939")
+                    IAppCapability2 : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE get_DisplayMessage(
+                            HSTRING *value) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE put_DisplayMessage(
+                            HSTRING value) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2, 0x11c7ccb6, 0xc74f, 0x50a3, 0xb9,0x60, 0x88,0x00,0x87,0x67,0xd9,0x39)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
+        TrustLevel *trustLevel);
+
+    /*** IAppCapability2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_DisplayMessage)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_DisplayMessage)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
+        HSTRING value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2Vtbl;
+
+interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 {
+    CONST_VTBL __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAppCapability2 methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_get_DisplayMessage(This,value) (This)->lpVtbl->get_DisplayMessage(This,value)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_put_DisplayMessage(This,value) (This)->lpVtbl->put_DisplayMessage(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_QueryInterface(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_AddRef(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_Release(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetIids(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetTrustLevel(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAppCapability2 methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_get_DisplayMessage(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,HSTRING *value) {
+    return This->lpVtbl->get_DisplayMessage(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_put_DisplayMessage(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,HSTRING value) {
+    return This->lpVtbl->put_DisplayMessage(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Security_Authorization_AppCapabilityAccess
+#define IID_IAppCapability2 IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2
+#define IAppCapability2Vtbl __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2Vtbl
+#define IAppCapability2 __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2
+#define IAppCapability2_QueryInterface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_QueryInterface
+#define IAppCapability2_AddRef __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_AddRef
+#define IAppCapability2_Release __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_Release
+#define IAppCapability2_GetIids __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetIids
+#define IAppCapability2_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetRuntimeClassName
+#define IAppCapability2_GetTrustLevel __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetTrustLevel
+#define IAppCapability2_get_DisplayMessage __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_get_DisplayMessage
+#define IAppCapability2_put_DisplayMessage __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_put_DisplayMessage
+#endif /* WIDL_using_Windows_Security_Authorization_AppCapabilityAccess */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000 */
+
+/*****************************************************************************
+ * IAppCapabilityAccessChangedEventArgs interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs, 0x0a578d15, 0xbdd7, 0x457e, 0x8c,0xca, 0x6f,0x53,0xbd,0x2e,0x59,0x44);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    MIDL_INTERFACE("0a578d15-bdd7-457e-8cca-6f53bd2e5944")
+                    IAppCapabilityAccessChangedEventArgs : public IInspectable
+                    {
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs, 0x0a578d15, 0xbdd7, 0x457e, 0x8c,0xca, 0x6f,0x53,0xbd,0x2e,0x59,0x44)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *This,
+        TrustLevel *trustLevel);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgsVtbl;
+
+interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs {
+    CONST_VTBL __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_QueryInterface(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_AddRef(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_Release(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetIids(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+#endif
+#ifdef WIDL_using_Windows_Security_Authorization_AppCapabilityAccess
+#define IID_IAppCapabilityAccessChangedEventArgs IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs
+#define IAppCapabilityAccessChangedEventArgsVtbl __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgsVtbl
+#define IAppCapabilityAccessChangedEventArgs __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs
+#define IAppCapabilityAccessChangedEventArgs_QueryInterface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_QueryInterface
+#define IAppCapabilityAccessChangedEventArgs_AddRef __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_AddRef
+#define IAppCapabilityAccessChangedEventArgs_Release __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_Release
+#define IAppCapabilityAccessChangedEventArgs_GetIids __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetIids
+#define IAppCapabilityAccessChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetRuntimeClassName
+#define IAppCapabilityAccessChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetTrustLevel
+#endif /* WIDL_using_Windows_Security_Authorization_AppCapabilityAccess */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
+
+/*****************************************************************************
+ * IAppCapabilityStatics interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
+#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics, 0x7c353e2a, 0x46ee, 0x44e5, 0xaf,0x3d, 0x6a,0xd3,0xfc,0x49,0xbd,0x22);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Security {
+            namespace Authorization {
+                namespace AppCapabilityAccess {
+                    MIDL_INTERFACE("7c353e2a-46ee-44e5-af3d-6ad3fc49bd22")
+                    IAppCapabilityStatics : public IInspectable
+                    {
+                        virtual HRESULT STDMETHODCALLTYPE RequestAccessForCapabilitiesAsync(
+                            ABI::Windows::Foundation::Collections::IIterable<HSTRING > *capability_names,
+                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > **operation) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE RequestAccessForCapabilitiesForUserAsync(
+                            ABI::Windows::System::IUser *user,
+                            ABI::Windows::Foundation::Collections::IIterable<HSTRING > *capability_names,
+                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > **operation) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE Create(
+                            HSTRING capability_name,
+                            ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability **result) = 0;
+
+                        virtual HRESULT STDMETHODCALLTYPE CreateWithProcessIdForUser(
+                            ABI::Windows::System::IUser *user,
+                            HSTRING capability_name,
+                            UINT32 pid,
+                            ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability **result) = 0;
+
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics, 0x7c353e2a, 0x46ee, 0x44e5, 0xaf,0x3d, 0x6a,0xd3,0xfc,0x49,0xbd,0x22)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStaticsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
+        TrustLevel *trustLevel);
+
+    /*** IAppCapabilityStatics methods ***/
+    HRESULT (STDMETHODCALLTYPE *RequestAccessForCapabilitiesAsync)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
+        __FIIterable_1_HSTRING *capability_names,
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **operation);
+
+    HRESULT (STDMETHODCALLTYPE *RequestAccessForCapabilitiesForUserAsync)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
+        __x_ABI_CWindows_CSystem_CIUser *user,
+        __FIIterable_1_HSTRING *capability_names,
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **operation);
+
+    HRESULT (STDMETHODCALLTYPE *Create)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
+        HSTRING capability_name,
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability **result);
+
+    HRESULT (STDMETHODCALLTYPE *CreateWithProcessIdForUser)(
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
+        __x_ABI_CWindows_CSystem_CIUser *user,
+        HSTRING capability_name,
+        UINT32 pid,
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability **result);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStaticsVtbl;
+
+interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics {
+    CONST_VTBL __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStaticsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAppCapabilityStatics methods ***/
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesAsync(This,capability_names,operation) (This)->lpVtbl->RequestAccessForCapabilitiesAsync(This,capability_names,operation)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesForUserAsync(This,user,capability_names,operation) (This)->lpVtbl->RequestAccessForCapabilitiesForUserAsync(This,user,capability_names,operation)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Create(This,capability_name,result) (This)->lpVtbl->Create(This,capability_name,result)
+#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_CreateWithProcessIdForUser(This,user,capability_name,pid,result) (This)->lpVtbl->CreateWithProcessIdForUser(This,user,capability_name,pid,result)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_QueryInterface(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_AddRef(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Release(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetIids(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetTrustLevel(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAppCapabilityStatics methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesAsync(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,__FIIterable_1_HSTRING *capability_names,__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **operation) {
+    return This->lpVtbl->RequestAccessForCapabilitiesAsync(This,capability_names,operation);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesForUserAsync(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,__x_ABI_CWindows_CSystem_CIUser *user,__FIIterable_1_HSTRING *capability_names,__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **operation) {
+    return This->lpVtbl->RequestAccessForCapabilitiesForUserAsync(This,user,capability_names,operation);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Create(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,HSTRING capability_name,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability **result) {
+    return This->lpVtbl->Create(This,capability_name,result);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_CreateWithProcessIdForUser(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,__x_ABI_CWindows_CSystem_CIUser *user,HSTRING capability_name,UINT32 pid,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability **result) {
+    return This->lpVtbl->CreateWithProcessIdForUser(This,user,capability_name,pid,result);
+}
+#endif
+#ifdef WIDL_using_Windows_Security_Authorization_AppCapabilityAccess
+#define IID_IAppCapabilityStatics IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics
+#define IAppCapabilityStaticsVtbl __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStaticsVtbl
+#define IAppCapabilityStatics __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics
+#define IAppCapabilityStatics_QueryInterface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_QueryInterface
+#define IAppCapabilityStatics_AddRef __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_AddRef
+#define IAppCapabilityStatics_Release __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Release
+#define IAppCapabilityStatics_GetIids __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetIids
+#define IAppCapabilityStatics_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetRuntimeClassName
+#define IAppCapabilityStatics_GetTrustLevel __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetTrustLevel
+#define IAppCapabilityStatics_RequestAccessForCapabilitiesAsync __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesAsync
+#define IAppCapabilityStatics_RequestAccessForCapabilitiesForUserAsync __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesForUserAsync
+#define IAppCapabilityStatics_Create __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Create
+#define IAppCapabilityStatics_CreateWithProcessIdForUser __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_CreateWithProcessIdForUser
+#endif /* WIDL_using_Windows_Security_Authorization_AppCapabilityAccess */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
+
+/*
+ * Class Windows.Security.Authorization.AppCapabilityAccess.AppCapability
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
+#ifndef RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapability_DEFINED
+#define RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapability_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapability[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','A','u','t','h','o','r','i','z','a','t','i','o','n','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','.','A','p','p','C','a','p','a','b','i','l','i','t','y',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapability[] = L"Windows.Security.Authorization.AppCapabilityAccess.AppCapability";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapability[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','A','u','t','h','o','r','i','z','a','t','i','o','n','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','.','A','p','p','C','a','p','a','b','i','l','i','t','y',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapability_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
+
+/*
+ * Class Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessChangedEventArgs
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
+#ifndef RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs_DEFINED
+#define RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','A','u','t','h','o','r','i','z','a','t','i','o','n','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs[] = L"Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessChangedEventArgs";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','A','u','t','h','o','r','i','z','a','t','i','o','n','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
+
+/*****************************************************************************
+ * IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > interface
+ */
+#ifndef ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+#define ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0xc0538d02, 0x01f7, 0x51a1, 0x99,0xbd, 0x3d,0x14,0x8d,0x05,0x5f,0xa1);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("c0538d02-01f7-51a1-99bd-3d148d055fa1")
+                IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > : IKeyValuePair_impl<HSTRING, ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0xc0538d02, 0x01f7, 0x51a1, 0x99,0xbd, 0x3d,0x14,0x8d,0x05,0x5f,0xa1)
+#endif
+#else
+typedef struct __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        TrustLevel *trustLevel);
+
+    /*** IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Key)(
+        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        HSTRING *key);
+
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *value);
+
+    END_INTERFACE
+} __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl;
+
+interface __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus {
+    CONST_VTBL __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Key(This,key) (This)->lpVtbl->get_Key(This,key)
+#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+static __WIDL_INLINE HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Key(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *key) {
+    return This->lpVtbl->get_Key(This,key);
+}
+static __WIDL_INLINE HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Value(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IKeyValuePair_HSTRING_AppCapabilityAccessStatus IID___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
+#define IKeyValuePair_HSTRING_AppCapabilityAccessStatusVtbl __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl
+#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
+#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
+#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_AddRef __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef
+#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_Release __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release
+#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetIids __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids
+#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName
+#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetTrustLevel __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel
+#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_get_Key __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Key
+#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_get_Value __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Value
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > interface
+ */
+#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0x62e88ad9, 0xd63e, 0x5173, 0xba,0xa2, 0xbb,0x45,0x21,0xc7,0xe8,0x2a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("62e88ad9-d63e-5173-baa2-bb4521c7e82a")
+                IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > : IIterable_impl<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0x62e88ad9, 0xd63e, 0x5173, 0xba,0xa2, 0xbb,0x45,0x21,0xc7,0xe8,0x2a)
+#endif
+#else
+typedef struct __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        TrustLevel *trustLevel);
+
+    /*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *First)(
+        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **value);
+
+    END_INTERFACE
+} __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl;
+
+interface __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus {
+    CONST_VTBL __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_First(This,value) (This)->lpVtbl->First(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+static __WIDL_INLINE HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_First(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **value) {
+    return This->lpVtbl->First(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus IID___FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
+#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatusVtbl __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl
+#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
+#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
+#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_AddRef __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef
+#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_Release __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release
+#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetIids __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids
+#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName
+#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetTrustLevel __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel
+#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_First __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_First
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > interface
+ */
+#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0x4e97286e, 0x7954, 0x5b79, 0xbe,0xa1, 0x83,0xaf,0x14,0x2e,0x4f,0xb2);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("4e97286e-7954-5b79-bea1-83af142e4fb2")
+                IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > : IIterator_impl<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0x4e97286e, 0x7954, 0x5b79, 0xbe,0xa1, 0x83,0xaf,0x14,0x2e,0x4f,0xb2)
+#endif
+#else
+typedef struct __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        TrustLevel *trustLevel);
+
+    /*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Current)(
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *MoveNext)(
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        boolean *value);
+
+    HRESULT (STDMETHODCALLTYPE *GetMany)(
+        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
+        UINT32 items_size,
+        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **items,
+        UINT32 *value);
+
+    END_INTERFACE
+} __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl;
+
+interface __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus {
+    CONST_VTBL __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
+#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+static __WIDL_INLINE HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Current(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **value) {
+    return This->lpVtbl->get_Current(This,value);
+}
+static __WIDL_INLINE HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_HasCurrent(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,boolean *value) {
+    return This->lpVtbl->get_HasCurrent(This,value);
+}
+static __WIDL_INLINE HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_MoveNext(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,boolean *value) {
+    return This->lpVtbl->MoveNext(This,value);
+}
+static __WIDL_INLINE HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetMany(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,UINT32 items_size,__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **items,UINT32 *value) {
+    return This->lpVtbl->GetMany(This,items_size,items,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus IID___FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatusVtbl __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_AddRef __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_Release __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetIids __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetTrustLevel __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_get_Current __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Current
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_get_HasCurrent __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_HasCurrent
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_MoveNext __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_MoveNext
+#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetMany __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetMany
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > interface
+ */
+#ifndef ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+#define ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0x20366438, 0x9fab, 0x5c12, 0x87,0xeb, 0xda,0x86,0x7e,0x38,0x3f,0xe7);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("20366438-9fab-5c12-87eb-da867e383fe7")
+                IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > : IMapView_impl<HSTRING, ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0x20366438, 0x9fab, 0x5c12, 0x87,0xeb, 0xda,0x86,0x7e,0x38,0x3f,0xe7)
+#endif
+#else
+typedef struct __FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        TrustLevel *trustLevel);
+
+    /*** IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Lookup)(
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        HSTRING key,
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Size)(
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        unsigned int *size);
+
+    HRESULT (STDMETHODCALLTYPE *HasKey)(
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        HSTRING key,
+        boolean *found);
+
+    HRESULT (STDMETHODCALLTYPE *Split)(
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus **first,
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus **second);
+
+    END_INTERFACE
+} __FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl;
+
+interface __FIMapView_2_HSTRING_AppCapabilityAccessStatus {
+    CONST_VTBL __FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
+#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Split(This,first,second) (This)->lpVtbl->Split(This,first,second)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+static __WIDL_INLINE HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Lookup(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING key,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *value) {
+    return This->lpVtbl->Lookup(This,key,value);
+}
+static __WIDL_INLINE HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Size(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,unsigned int *size) {
+    return This->lpVtbl->get_Size(This,size);
+}
+static __WIDL_INLINE HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_HasKey(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING key,boolean *found) {
+    return This->lpVtbl->HasKey(This,key,found);
+}
+static __WIDL_INLINE HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Split(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,__FIMapView_2_HSTRING_AppCapabilityAccessStatus **first,__FIMapView_2_HSTRING_AppCapabilityAccessStatus **second) {
+    return This->lpVtbl->Split(This,first,second);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IMapView_HSTRING_AppCapabilityAccessStatus IID___FIMapView_2_HSTRING_AppCapabilityAccessStatus
+#define IMapView_HSTRING_AppCapabilityAccessStatusVtbl __FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl
+#define IMapView_HSTRING_AppCapabilityAccessStatus __FIMapView_2_HSTRING_AppCapabilityAccessStatus
+#define IMapView_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
+#define IMapView_HSTRING_AppCapabilityAccessStatus_AddRef __FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef
+#define IMapView_HSTRING_AppCapabilityAccessStatus_Release __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release
+#define IMapView_HSTRING_AppCapabilityAccessStatus_GetIids __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids
+#define IMapView_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName
+#define IMapView_HSTRING_AppCapabilityAccessStatus_GetTrustLevel __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel
+#define IMapView_HSTRING_AppCapabilityAccessStatus_Lookup __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Lookup
+#define IMapView_HSTRING_AppCapabilityAccessStatus_get_Size __FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Size
+#define IMapView_HSTRING_AppCapabilityAccessStatus_HasKey __FIMapView_2_HSTRING_AppCapabilityAccessStatus_HasKey
+#define IMapView_HSTRING_AppCapabilityAccessStatus_Split __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Split
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > interface
+ */
+#ifndef ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+#define ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0xa66001f3, 0xe332, 0x531a, 0xbf,0x49, 0x4e,0xdd,0x3a,0xf8,0x8d,0xe7);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("a66001f3-e332-531a-bf49-4edd3af88de7")
+            IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > : IAsyncOperation_impl<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0xa66001f3, 0xe332, 0x531a, 0xbf,0x49, 0x4e,0xdd,0x3a,0xf8,0x8d,0xe7)
+#endif
+#else
+typedef struct __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        TrustLevel *trustLevel);
+
+    /*** IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *put_Completed)(
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *handler);
+
+    HRESULT (STDMETHODCALLTYPE *get_Completed)(
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **handler);
+
+    HRESULT (STDMETHODCALLTYPE *GetResults)(
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        __FIMapView_2_HSTRING_AppCapabilityAccessStatus **results);
+
+    END_INTERFACE
+} __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl;
+
+interface __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus {
+    CONST_VTBL __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_put_Completed(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *handler) {
+    return This->lpVtbl->put_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Completed(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **handler) {
+    return This->lpVtbl->get_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetResults(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,__FIMapView_2_HSTRING_AppCapabilityAccessStatus **results) {
+    return This->lpVtbl->GetResults(This,results);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus IID___FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatusVtbl __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_AddRef __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_Release __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_GetIids __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_GetTrustLevel __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_put_Completed __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_put_Completed
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_get_Completed __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Completed
+#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_GetResults __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetResults
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > interface
+ */
+#ifndef ____FIAsyncOperation_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+#define ____FIAsyncOperation_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperation_1_AppCapabilityAccessStatus, 0x827caf42, 0x5fe6, 0x5b5b, 0x84,0xce, 0xc4,0x48,0x34,0x13,0x4d,0x3d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("827caf42-5fe6-5b5b-84ce-c44834134d3d")
+            IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > : IAsyncOperation_impl<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperation_1_AppCapabilityAccessStatus, 0x827caf42, 0x5fe6, 0x5b5b, 0x84,0xce, 0xc4,0x48,0x34,0x13,0x4d,0x3d)
+#endif
+#else
+typedef struct __FIAsyncOperation_1_AppCapabilityAccessStatusVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperation_1_AppCapabilityAccessStatus *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperation_1_AppCapabilityAccessStatus *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
+        TrustLevel *trustLevel);
+
+    /*** IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+    HRESULT (STDMETHODCALLTYPE *put_Completed)(
+        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
+        __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus *handler);
+
+    HRESULT (STDMETHODCALLTYPE *get_Completed)(
+        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
+        __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus **handler);
+
+    HRESULT (STDMETHODCALLTYPE *GetResults)(
+        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *results);
+
+    END_INTERFACE
+} __FIAsyncOperation_1_AppCapabilityAccessStatusVtbl;
+
+interface __FIAsyncOperation_1_AppCapabilityAccessStatus {
+    CONST_VTBL __FIAsyncOperation_1_AppCapabilityAccessStatusVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+#define __FIAsyncOperation_1_AppCapabilityAccessStatus_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_QueryInterface(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1_AppCapabilityAccessStatus_AddRef(__FIAsyncOperation_1_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1_AppCapabilityAccessStatus_Release(__FIAsyncOperation_1_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_GetIids(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_GetRuntimeClassName(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_GetTrustLevel(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_put_Completed(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus *handler) {
+    return This->lpVtbl->put_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_get_Completed(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus **handler) {
+    return This->lpVtbl->get_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_GetResults(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *results) {
+    return This->lpVtbl->GetResults(This,results);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperation_AppCapabilityAccessStatus IID___FIAsyncOperation_1_AppCapabilityAccessStatus
+#define IAsyncOperation_AppCapabilityAccessStatusVtbl __FIAsyncOperation_1_AppCapabilityAccessStatusVtbl
+#define IAsyncOperation_AppCapabilityAccessStatus __FIAsyncOperation_1_AppCapabilityAccessStatus
+#define IAsyncOperation_AppCapabilityAccessStatus_QueryInterface __FIAsyncOperation_1_AppCapabilityAccessStatus_QueryInterface
+#define IAsyncOperation_AppCapabilityAccessStatus_AddRef __FIAsyncOperation_1_AppCapabilityAccessStatus_AddRef
+#define IAsyncOperation_AppCapabilityAccessStatus_Release __FIAsyncOperation_1_AppCapabilityAccessStatus_Release
+#define IAsyncOperation_AppCapabilityAccessStatus_GetIids __FIAsyncOperation_1_AppCapabilityAccessStatus_GetIids
+#define IAsyncOperation_AppCapabilityAccessStatus_GetRuntimeClassName __FIAsyncOperation_1_AppCapabilityAccessStatus_GetRuntimeClassName
+#define IAsyncOperation_AppCapabilityAccessStatus_GetTrustLevel __FIAsyncOperation_1_AppCapabilityAccessStatus_GetTrustLevel
+#define IAsyncOperation_AppCapabilityAccessStatus_put_Completed __FIAsyncOperation_1_AppCapabilityAccessStatus_put_Completed
+#define IAsyncOperation_AppCapabilityAccessStatus_get_Completed __FIAsyncOperation_1_AppCapabilityAccessStatus_get_Completed
+#define IAsyncOperation_AppCapabilityAccessStatus_GetResults __FIAsyncOperation_1_AppCapabilityAccessStatus_GetResults
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperation_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > interface
+ */
+#ifndef ____FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0xbdf03ead, 0xa75b, 0x510c, 0x87,0xd2, 0x5b,0x57,0x53,0xbd,0xf1,0xbd);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("bdf03ead-a75b-510c-87d2-5b5753bdf1bd")
+            IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0xbdf03ead, 0xa75b, 0x510c, 0x87,0xd2, 0x5b,0x57,0x53,0xbd,0xf1,0xbd)
+#endif
+#else
+typedef struct __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This);
+
+    /*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
+        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *info,
+        AsyncStatus status);
+
+    END_INTERFACE
+} __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl;
+
+interface __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus {
+    CONST_VTBL __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+#define __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Invoke(__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *info,AsyncStatus status) {
+    return This->lpVtbl->Invoke(This,info,status);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus IID___FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus
+#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatusVtbl __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl
+#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus
+#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
+#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus_AddRef __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef
+#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus_Release __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release
+#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus_Invoke __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > interface
+ */
+#ifndef ____FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus, 0x6ea0f2e9, 0xbc97, 0x58e8, 0xa3,0xa6, 0xc8,0x29,0xb9,0xe5,0xf2,0xaa);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("6ea0f2e9-bc97-58e8-a3a6-c829b9e5f2aa")
+            IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus, 0x6ea0f2e9, 0xbc97, 0x58e8, 0xa3,0xa6, 0xc8,0x29,0xb9,0xe5,0xf2,0xaa)
+#endif
+#else
+typedef struct __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatusVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus *This);
+
+    /*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus *This,
+        __FIAsyncOperation_1_AppCapabilityAccessStatus *info,
+        AsyncStatus status);
+
+    END_INTERFACE
+} __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatusVtbl;
+
+interface __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus {
+    CONST_VTBL __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatusVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+#define __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_QueryInterface(__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_AddRef(__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Release(__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Invoke(__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus* This,__FIAsyncOperation_1_AppCapabilityAccessStatus *info,AsyncStatus status) {
+    return This->lpVtbl->Invoke(This,info,status);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperationCompletedHandler_AppCapabilityAccessStatus IID___FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus
+#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatusVtbl __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatusVtbl
+#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatus __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus
+#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatus_QueryInterface __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_QueryInterface
+#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatus_AddRef __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_AddRef
+#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatus_Release __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Release
+#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatus_Invoke __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > interface
+ */
+#ifndef ____FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__
+#define ____FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs, 0x6d923c95, 0x7b83, 0x5f59, 0x88,0x83, 0xf4,0x41,0x75,0x28,0x48,0x98);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("6d923c95-7b83-5f59-8883-f44175284898")
+            ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*, ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs*, ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapabilityAccessChangedEventArgs* > >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs, 0x6d923c95, 0x7b83, 0x5f59, 0x88,0x83, 0xf4,0x41,0x75,0x28,0x48,0x98)
+#endif
+#else
+typedef struct __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs *This);
+
+    /*** ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs *This,
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *sender,
+        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *args);
+
+    END_INTERFACE
+} __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgsVtbl;
+
+interface __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs {
+    CONST_VTBL __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > methods ***/
+#define __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Release(__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > methods ***/
+static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs* This,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *sender,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *args) {
+    return This->lpVtbl->Invoke(This,sender,args);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs IID___FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs
+#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgsVtbl __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgsVtbl
+#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs
+#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_QueryInterface
+#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs_AddRef __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_AddRef
+#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs_Release __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Release
+#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs_Invoke __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_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_security_authorization_appcapabilityaccess_h__ */
diff --git a/mingw-w64-headers/include/windows.security.authorization.appcapabilityaccess.idl b/mingw-w64-headers/include/windows.security.authorization.appcapabilityaccess.idl
new file mode 100644
index 0000000..321d62a
--- /dev/null
+++ b/mingw-w64-headers/include/windows.security.authorization.appcapabilityaccess.idl
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2024 Biswapriyo Nath
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+import "inspectable.idl";
+import "asyncinfo.idl";
+import "eventtoken.idl";
+import "windowscontracts.idl";
+import "windows.foundation.idl";
+import "windows.system.idl";
+
+namespace Windows.Security.Authorization.AppCapabilityAccess {
+    typedef enum AppCapabilityAccessStatus AppCapabilityAccessStatus;
+
+    interface IAppCapability;
+    interface IAppCapability2;
+    interface IAppCapabilityAccessChangedEventArgs;
+    interface IAppCapabilityStatics;
+
+    runtimeclass AppCapability;
+    runtimeclass AppCapabilityAccessChangedEventArgs;
+
+    declare {
+        interface Windows.Foundation.Collections.IKeyValuePair<HSTRING, Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus>;
+        interface Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus> *>;
+        interface Windows.Foundation.Collections.IIterator<Windows.Foundation.Collections.IKeyValuePair<HSTRING, Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus> *>;
+        interface Windows.Foundation.Collections.IMapView<HSTRING, Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus>;
+        interface Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IMapView<HSTRING, Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus> *>;
+        interface Windows.Foundation.IAsyncOperation<Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus>;
+        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Foundation.Collections.IMapView<HSTRING, Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus> *>;
+        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus>;
+        interface Windows.Foundation.TypedEventHandler<Windows.Security.Authorization.AppCapabilityAccess.AppCapability *, Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessChangedEventArgs *>;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0)
+    ]
+    enum AppCapabilityAccessStatus
+    {
+        DeniedBySystem     = 0,
+        NotDeclaredByApp   = 1,
+        DeniedByUser       = 2,
+        UserPromptRequired = 3,
+        Allowed            = 4,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.Security.Authorization.AppCapabilityAccess.AppCapability),
+        uuid(4c49d915-8a2a-4295-9437-2df7c396aff4)
+    ]
+    interface IAppCapability : IInspectable
+    {
+        [propget] HRESULT CapabilityName([out, retval] HSTRING *value);
+        [propget] HRESULT User([out, retval] Windows.System.User **value);
+        HRESULT RequestAccessAsync([out, retval] Windows.Foundation.IAsyncOperation<Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus> **operation);
+        HRESULT CheckAccess([out, retval] Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus *result);
+        [eventadd] HRESULT AccessChanged(
+            [in] Windows.Foundation.TypedEventHandler<Windows.Security.Authorization.AppCapabilityAccess.AppCapability *, Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessChangedEventArgs *> *handler,
+            [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT AccessChanged([in] EventRegistrationToken token);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 15.0),
+        exclusiveto(Windows.Security.Authorization.AppCapabilityAccess.AppCapability),
+        uuid(11c7ccb6-c74f-50a3-b960-88008767d939)
+    ]
+    interface IAppCapability2 : IInspectable
+    {
+        [propget] HRESULT DisplayMessage([out, retval] HSTRING *value);
+        [propput] HRESULT DisplayMessage([in] HSTRING value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessChangedEventArgs),
+        uuid(0a578d15-bdd7-457e-8cca-6f53bd2e5944)
+    ]
+    interface IAppCapabilityAccessChangedEventArgs : IInspectable
+    {
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.Security.Authorization.AppCapabilityAccess.AppCapability),
+        uuid(7c353e2a-46ee-44e5-af3d-6ad3fc49bd22)
+    ]
+    interface IAppCapabilityStatics : IInspectable
+    {
+        HRESULT RequestAccessForCapabilitiesAsync(
+            [in] Windows.Foundation.Collections.IIterable<HSTRING> *capability_names,
+            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IMapView<HSTRING, Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus> *> **operation);
+        HRESULT RequestAccessForCapabilitiesForUserAsync(
+            [in] Windows.System.User *user,
+            [in] Windows.Foundation.Collections.IIterable<HSTRING> *capability_names,
+            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IMapView<HSTRING, Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessStatus> *> **operation);
+        HRESULT Create(
+            [in] HSTRING capability_name,
+            [out, retval] Windows.Security.Authorization.AppCapabilityAccess.AppCapability **result);
+        HRESULT CreateWithProcessIdForUser(
+            [in] Windows.System.User *user,
+            [in] HSTRING capability_name,
+            [in] UINT32 pid,
+            [out, retval] Windows.Security.Authorization.AppCapabilityAccess.AppCapability **result);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        marshaling_behavior(agile),
+        static(Windows.Security.Authorization.AppCapabilityAccess.IAppCapabilityStatics, Windows.Foundation.UniversalApiContract, 8.0),
+        threading(both)
+    ]
+    runtimeclass AppCapability
+    {
+        [default] interface Windows.Security.Authorization.AppCapabilityAccess.IAppCapability;
+        [contract(Windows.Foundation.UniversalApiContract, 15.0)] interface Windows.Security.Authorization.AppCapabilityAccess.IAppCapability2;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass AppCapabilityAccessChangedEventArgs
+    {
+        [default] interface Windows.Security.Authorization.AppCapabilityAccess.IAppCapabilityAccessChangedEventArgs;
+    }
+}
diff --git a/mingw-w64-headers/include/windows.storage.streams.h b/mingw-w64-headers/include/windows.storage.streams.h
index b6c3b4d..90aae7a 100644
--- a/mingw-w64-headers/include/windows.storage.streams.h
+++ b/mingw-w64-headers/include/windows.storage.streams.h
@@ -77,6 +77,57 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriter __x_ABI_CWindows_CStorage_CStreams_CIDataWriter;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter ABI::Windows::Storage::Streams::IDataWriter
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IDataWriter;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory ABI::Windows::Storage::Streams::IDataWriterFactory
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IDataWriterFactory;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIOutputStream __x_ABI_CWindows_CStorage_CStreams_CIOutputStream;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream ABI::Windows::Storage::Streams::IOutputStream
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IOutputStream;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_FWD_DEFINED__
 #define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream;
@@ -94,6 +145,40 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference ABI::Windows::Storage::Streams::IRandomAccessStreamReference
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IRandomAccessStreamReference;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics ABI::Windows::Storage::Streams::IRandomAccessStreamReferenceStatics
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IRandomAccessStreamReferenceStatics;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_FWD_DEFINED__
 #define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType;
@@ -162,6 +247,40 @@
 #endif /* defined __cplusplus */
 #endif /* defined ____x_ABI_CWindows_CStorage_CStreams_CBuffer_FWD_DEFINED__ */
 
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CDataWriter_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CDataWriter_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                class DataWriter;
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CStorage_CStreams_CDataWriter __x_ABI_CWindows_CStorage_CStreams_CDataWriter;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CStorage_CStreams_CDataWriter_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CDataWriterStoreOperation_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CDataWriterStoreOperation_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                class DataWriterStoreOperation;
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CStorage_CStreams_CDataWriterStoreOperation __x_ABI_CWindows_CStorage_CStreams_CDataWriterStoreOperation;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CStorage_CStreams_CDataWriterStoreOperation_FWD_DEFINED__ */
+
 #ifndef ____x_ABI_CWindows_CStorage_CStreams_CRandomAccessStreamReference_FWD_DEFINED__
 #define ____x_ABI_CWindows_CStorage_CStreams_CRandomAccessStreamReference_FWD_DEFINED__
 #ifdef __cplusplus
@@ -219,6 +338,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
+typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream;
+#ifdef __cplusplus
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
 #define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
 typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream;
@@ -227,6 +354,22 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
+typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference;
+#ifdef __cplusplus
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
+typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType;
+#ifdef __cplusplus
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_FWD_DEFINED__
 #define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_FWD_DEFINED__
 typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer __FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer;
@@ -235,6 +378,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
 #define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
 typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream;
@@ -243,6 +394,22 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* >
+#endif /* __cplusplus */
+#endif
+
 /* Headers for imported files */
 
 #include <inspectable.h>
@@ -253,6 +420,29 @@
 extern "C" {
 #endif
 
+#ifndef ____x_ABI_CWindows_CStorage_CIStorageFile_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CIStorageFile_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CIStorageFile __x_ABI_CWindows_CStorage_CIStorageFile;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CStorage_CIStorageFile ABI::Windows::Storage::IStorageFile
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            interface IStorageFile;
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef __cplusplus
+typedef enum __x_ABI_CWindows_CStorage_CStreams_CByteOrder __x_ABI_CWindows_CStorage_CStreams_CByteOrder;
+#endif /* __cplusplus */
+
+#ifndef __cplusplus
+typedef enum __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding;
+#endif /* __cplusplus */
+
 #ifndef ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_FWD_DEFINED__
 #define ____x_ABI_CWindows_CStorage_CStreams_CIBuffer_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CStorage_CStreams_CIBuffer __x_ABI_CWindows_CStorage_CStreams_CIBuffer;
@@ -321,6 +511,40 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriter __x_ABI_CWindows_CStorage_CStreams_CIDataWriter;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter ABI::Windows::Storage::Streams::IDataWriter
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IDataWriter;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_FWD_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory ABI::Windows::Storage::Streams::IDataWriterFactory
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                interface IDataWriterFactory;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____x_ABI_CWindows_CStorage_CStreams_CIInputStream_FWD_DEFINED__
 #define ____x_ABI_CWindows_CStorage_CStreams_CIInputStream_FWD_DEFINED__
 typedef interface __x_ABI_CWindows_CStorage_CStreams_CIInputStream __x_ABI_CWindows_CStorage_CStreams_CIInputStream;
@@ -497,6 +721,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* >
+#endif /* __cplusplus */
+#endif
+
 #ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
 #define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_FWD_DEFINED__
 typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream;
@@ -505,6 +737,78 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* >
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_FWD_DEFINED__
+typedef interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType;
+#ifdef __cplusplus
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* >
+#endif /* __cplusplus */
+#endif
+
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                enum ByteOrder {
+                    ByteOrder_LittleEndian = 0,
+                    ByteOrder_BigEndian = 1
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CStorage_CStreams_CByteOrder {
+    ByteOrder_LittleEndian = 0,
+    ByteOrder_BigEndian = 1
+};
+#ifdef WIDL_using_Windows_Storage_Streams
+#define ByteOrder __x_ABI_CWindows_CStorage_CStreams_CByteOrder
+#endif /* WIDL_using_Windows_Storage_Streams */
+#endif
+
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                enum UnicodeEncoding {
+                    UnicodeEncoding_Utf8 = 0,
+                    UnicodeEncoding_Utf16LE = 1,
+                    UnicodeEncoding_Utf16BE = 2
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding {
+    UnicodeEncoding_Utf8 = 0,
+    UnicodeEncoding_Utf16LE = 1,
+    UnicodeEncoding_Utf16BE = 2
+};
+#ifdef WIDL_using_Windows_Storage_Streams
+#define UnicodeEncoding __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding
+#endif /* WIDL_using_Windows_Storage_Streams */
+#endif
+
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 /*****************************************************************************
  * IBuffer interface
  */
@@ -932,6 +1236,728 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*****************************************************************************
+ * IDataWriter interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIDataWriter, 0x64b89265, 0xd341, 0x4922, 0xb3,0x8a, 0xdd,0x4a,0xf8,0x80,0x8c,0x4e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                MIDL_INTERFACE("64b89265-d341-4922-b38a-dd4af8808c4e")
+                IDataWriter : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE get_UnstoredBufferLength(
+                        UINT32 *value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_UnicodeEncoding(
+                        ABI::Windows::Storage::Streams::UnicodeEncoding *value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE put_UnicodeEncoding(
+                        ABI::Windows::Storage::Streams::UnicodeEncoding value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_ByteOrder(
+                        ABI::Windows::Storage::Streams::ByteOrder *value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE put_ByteOrder(
+                        ABI::Windows::Storage::Streams::ByteOrder value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteByte(
+                        BYTE value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteBytes(
+                        UINT32 value_size,
+                        BYTE *value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteBuffer(
+                        ABI::Windows::Storage::Streams::IBuffer *buffer) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteBufferRange(
+                        ABI::Windows::Storage::Streams::IBuffer *buffer,
+                        UINT32 start,
+                        UINT32 count) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteBoolean(
+                        boolean value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteGuid(
+                        GUID value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteInt16(
+                        INT16 value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteInt32(
+                        INT32 value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteInt64(
+                        INT64 value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteUInt16(
+                        UINT16 value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteUInt32(
+                        UINT32 value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteUInt64(
+                        UINT64 value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteSingle(
+                        FLOAT value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteDouble(
+                        DOUBLE value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteDateTime(
+                        ABI::Windows::Foundation::DateTime value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteTimeSpan(
+                        ABI::Windows::Foundation::TimeSpan value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE WriteString(
+                        HSTRING value,
+                        UINT32 *code_unit_count) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE MeasureString(
+                        HSTRING value,
+                        UINT32 *code_unit_count) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE StoreAsync(
+                        ABI::Windows::Foundation::IAsyncOperation<UINT32 > **operation) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE FlushAsync(
+                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE DetachBuffer(
+                        ABI::Windows::Storage::Streams::IBuffer **buffer) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE DetachStream(
+                        ABI::Windows::Storage::Streams::IOutputStream **output_stream) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter, 0x64b89265, 0xd341, 0x4922, 0xb3,0x8a, 0xdd,0x4a,0xf8,0x80,0x8c,0x4e)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CStorage_CStreams_CIDataWriterVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        TrustLevel *trustLevel);
+
+    /*** IDataWriter methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_UnstoredBufferLength)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        UINT32 *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_UnicodeEncoding)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_UnicodeEncoding)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding value);
+
+    HRESULT (STDMETHODCALLTYPE *get_ByteOrder)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __x_ABI_CWindows_CStorage_CStreams_CByteOrder *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_ByteOrder)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __x_ABI_CWindows_CStorage_CStreams_CByteOrder value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteByte)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        BYTE value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteBytes)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        UINT32 value_size,
+        BYTE *value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteBuffer)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer);
+
+    HRESULT (STDMETHODCALLTYPE *WriteBufferRange)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,
+        UINT32 start,
+        UINT32 count);
+
+    HRESULT (STDMETHODCALLTYPE *WriteBoolean)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        boolean value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteGuid)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        GUID value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteInt16)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        INT16 value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteInt32)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        INT32 value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteInt64)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        INT64 value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteUInt16)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        UINT16 value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteUInt32)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        UINT32 value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteUInt64)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        UINT64 value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteSingle)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        FLOAT value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteDouble)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        DOUBLE value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteDateTime)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __x_ABI_CWindows_CFoundation_CDateTime value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteTimeSpan)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __x_ABI_CWindows_CFoundation_CTimeSpan value);
+
+    HRESULT (STDMETHODCALLTYPE *WriteString)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        HSTRING value,
+        UINT32 *code_unit_count);
+
+    HRESULT (STDMETHODCALLTYPE *MeasureString)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        HSTRING value,
+        UINT32 *code_unit_count);
+
+    HRESULT (STDMETHODCALLTYPE *StoreAsync)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __FIAsyncOperation_1_UINT32 **operation);
+
+    HRESULT (STDMETHODCALLTYPE *FlushAsync)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __FIAsyncOperation_1_boolean **operation);
+
+    HRESULT (STDMETHODCALLTYPE *DetachBuffer)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer **buffer);
+
+    HRESULT (STDMETHODCALLTYPE *DetachStream)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream **output_stream);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CStorage_CStreams_CIDataWriterVtbl;
+
+interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriter {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIDataWriterVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDataWriter methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnstoredBufferLength(This,value) (This)->lpVtbl->get_UnstoredBufferLength(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnicodeEncoding(This,value) (This)->lpVtbl->get_UnicodeEncoding(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_UnicodeEncoding(This,value) (This)->lpVtbl->put_UnicodeEncoding(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_ByteOrder(This,value) (This)->lpVtbl->get_ByteOrder(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_ByteOrder(This,value) (This)->lpVtbl->put_ByteOrder(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteByte(This,value) (This)->lpVtbl->WriteByte(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBytes(This,value_size,value) (This)->lpVtbl->WriteBytes(This,value_size,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBuffer(This,buffer) (This)->lpVtbl->WriteBuffer(This,buffer)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBufferRange(This,buffer,start,count) (This)->lpVtbl->WriteBufferRange(This,buffer,start,count)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBoolean(This,value) (This)->lpVtbl->WriteBoolean(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteGuid(This,value) (This)->lpVtbl->WriteGuid(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt16(This,value) (This)->lpVtbl->WriteInt16(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt32(This,value) (This)->lpVtbl->WriteInt32(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt64(This,value) (This)->lpVtbl->WriteInt64(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt16(This,value) (This)->lpVtbl->WriteUInt16(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt32(This,value) (This)->lpVtbl->WriteUInt32(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt64(This,value) (This)->lpVtbl->WriteUInt64(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteSingle(This,value) (This)->lpVtbl->WriteSingle(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDouble(This,value) (This)->lpVtbl->WriteDouble(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDateTime(This,value) (This)->lpVtbl->WriteDateTime(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteTimeSpan(This,value) (This)->lpVtbl->WriteTimeSpan(This,value)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteString(This,value,code_unit_count) (This)->lpVtbl->WriteString(This,value,code_unit_count)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_MeasureString(This,value,code_unit_count) (This)->lpVtbl->MeasureString(This,value,code_unit_count)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_StoreAsync(This,operation) (This)->lpVtbl->StoreAsync(This,operation)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FlushAsync(This,operation) (This)->lpVtbl->FlushAsync(This,operation)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachBuffer(This,buffer) (This)->lpVtbl->DetachBuffer(This,buffer)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachStream(This,output_stream) (This)->lpVtbl->DetachStream(This,output_stream)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_Release(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDataWriter methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnstoredBufferLength(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,UINT32 *value) {
+    return This->lpVtbl->get_UnstoredBufferLength(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnicodeEncoding(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding *value) {
+    return This->lpVtbl->get_UnicodeEncoding(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_UnicodeEncoding(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CUnicodeEncoding value) {
+    return This->lpVtbl->put_UnicodeEncoding(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_ByteOrder(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CByteOrder *value) {
+    return This->lpVtbl->get_ByteOrder(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_ByteOrder(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CByteOrder value) {
+    return This->lpVtbl->put_ByteOrder(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteByte(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,BYTE value) {
+    return This->lpVtbl->WriteByte(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBytes(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,UINT32 value_size,BYTE *value) {
+    return This->lpVtbl->WriteBytes(This,value_size,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBuffer(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer) {
+    return This->lpVtbl->WriteBuffer(This,buffer);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBufferRange(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,UINT32 start,UINT32 count) {
+    return This->lpVtbl->WriteBufferRange(This,buffer,start,count);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBoolean(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,boolean value) {
+    return This->lpVtbl->WriteBoolean(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteGuid(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,GUID value) {
+    return This->lpVtbl->WriteGuid(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt16(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,INT16 value) {
+    return This->lpVtbl->WriteInt16(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt32(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,INT32 value) {
+    return This->lpVtbl->WriteInt32(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt64(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,INT64 value) {
+    return This->lpVtbl->WriteInt64(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt16(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,UINT16 value) {
+    return This->lpVtbl->WriteUInt16(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt32(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,UINT32 value) {
+    return This->lpVtbl->WriteUInt32(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt64(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,UINT64 value) {
+    return This->lpVtbl->WriteUInt64(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteSingle(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,FLOAT value) {
+    return This->lpVtbl->WriteSingle(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDouble(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,DOUBLE value) {
+    return This->lpVtbl->WriteDouble(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDateTime(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CFoundation_CDateTime value) {
+    return This->lpVtbl->WriteDateTime(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteTimeSpan(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
+    return This->lpVtbl->WriteTimeSpan(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteString(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,HSTRING value,UINT32 *code_unit_count) {
+    return This->lpVtbl->WriteString(This,value,code_unit_count);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_MeasureString(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,HSTRING value,UINT32 *code_unit_count) {
+    return This->lpVtbl->MeasureString(This,value,code_unit_count);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_StoreAsync(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__FIAsyncOperation_1_UINT32 **operation) {
+    return This->lpVtbl->StoreAsync(This,operation);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FlushAsync(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__FIAsyncOperation_1_boolean **operation) {
+    return This->lpVtbl->FlushAsync(This,operation);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachBuffer(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer **buffer) {
+    return This->lpVtbl->DetachBuffer(This,buffer);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachStream(__x_ABI_CWindows_CStorage_CStreams_CIDataWriter* This,__x_ABI_CWindows_CStorage_CStreams_CIOutputStream **output_stream) {
+    return This->lpVtbl->DetachStream(This,output_stream);
+}
+#endif
+#ifdef WIDL_using_Windows_Storage_Streams
+#define IID_IDataWriter IID___x_ABI_CWindows_CStorage_CStreams_CIDataWriter
+#define IDataWriterVtbl __x_ABI_CWindows_CStorage_CStreams_CIDataWriterVtbl
+#define IDataWriter __x_ABI_CWindows_CStorage_CStreams_CIDataWriter
+#define IDataWriter_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_QueryInterface
+#define IDataWriter_AddRef __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_AddRef
+#define IDataWriter_Release __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_Release
+#define IDataWriter_GetIids __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetIids
+#define IDataWriter_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetRuntimeClassName
+#define IDataWriter_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_GetTrustLevel
+#define IDataWriter_get_UnstoredBufferLength __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnstoredBufferLength
+#define IDataWriter_get_UnicodeEncoding __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_UnicodeEncoding
+#define IDataWriter_put_UnicodeEncoding __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_UnicodeEncoding
+#define IDataWriter_get_ByteOrder __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_get_ByteOrder
+#define IDataWriter_put_ByteOrder __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_put_ByteOrder
+#define IDataWriter_WriteByte __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteByte
+#define IDataWriter_WriteBytes __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBytes
+#define IDataWriter_WriteBuffer __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBuffer
+#define IDataWriter_WriteBufferRange __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBufferRange
+#define IDataWriter_WriteBoolean __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteBoolean
+#define IDataWriter_WriteGuid __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteGuid
+#define IDataWriter_WriteInt16 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt16
+#define IDataWriter_WriteInt32 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt32
+#define IDataWriter_WriteInt64 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteInt64
+#define IDataWriter_WriteUInt16 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt16
+#define IDataWriter_WriteUInt32 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt32
+#define IDataWriter_WriteUInt64 __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteUInt64
+#define IDataWriter_WriteSingle __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteSingle
+#define IDataWriter_WriteDouble __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDouble
+#define IDataWriter_WriteDateTime __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteDateTime
+#define IDataWriter_WriteTimeSpan __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteTimeSpan
+#define IDataWriter_WriteString __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_WriteString
+#define IDataWriter_MeasureString __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_MeasureString
+#define IDataWriter_StoreAsync __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_StoreAsync
+#define IDataWriter_FlushAsync __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_FlushAsync
+#define IDataWriter_DetachBuffer __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachBuffer
+#define IDataWriter_DetachStream __x_ABI_CWindows_CStorage_CStreams_CIDataWriter_DetachStream
+#endif /* WIDL_using_Windows_Storage_Streams */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CStorage_CStreams_CIDataWriter_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDataWriterFactory interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory, 0x338c67c2, 0x8b84, 0x4c2b, 0x9c,0x50, 0x7b,0x87,0x67,0x84,0x7a,0x1f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                MIDL_INTERFACE("338c67c2-8b84-4c2b-9c50-7b8767847a1f")
+                IDataWriterFactory : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE CreateDataWriter(
+                        ABI::Windows::Storage::Streams::IOutputStream *output_stream,
+                        ABI::Windows::Storage::Streams::IDataWriter **data_writer) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory, 0x338c67c2, 0x8b84, 0x4c2b, 0x9c,0x50, 0x7b,0x87,0x67,0x84,0x7a,0x1f)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactoryVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory *This,
+        TrustLevel *trustLevel);
+
+    /*** IDataWriterFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateDataWriter)(
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *output_stream,
+        __x_ABI_CWindows_CStorage_CStreams_CIDataWriter **data_writer);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactoryVtbl;
+
+interface __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactoryVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDataWriterFactory methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_CreateDataWriter(This,output_stream,data_writer) (This)->lpVtbl->CreateDataWriter(This,output_stream,data_writer)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_Release(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDataWriterFactory methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_CreateDataWriter(__x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory* This,__x_ABI_CWindows_CStorage_CStreams_CIOutputStream *output_stream,__x_ABI_CWindows_CStorage_CStreams_CIDataWriter **data_writer) {
+    return This->lpVtbl->CreateDataWriter(This,output_stream,data_writer);
+}
+#endif
+#ifdef WIDL_using_Windows_Storage_Streams
+#define IID_IDataWriterFactory IID___x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory
+#define IDataWriterFactoryVtbl __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactoryVtbl
+#define IDataWriterFactory __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory
+#define IDataWriterFactory_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_QueryInterface
+#define IDataWriterFactory_AddRef __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_AddRef
+#define IDataWriterFactory_Release __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_Release
+#define IDataWriterFactory_GetIids __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetIids
+#define IDataWriterFactory_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetRuntimeClassName
+#define IDataWriterFactory_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_GetTrustLevel
+#define IDataWriterFactory_CreateDataWriter __x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_CreateDataWriter
+#endif /* WIDL_using_Windows_Storage_Streams */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CStorage_CStreams_CIDataWriterFactory_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IOutputStream interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIOutputStream, 0x905a0fe6, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                MIDL_INTERFACE("905a0fe6-bc53-11df-8c49-001e4fc686da")
+                IOutputStream : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE WriteAsync(
+                        ABI::Windows::Storage::Streams::IBuffer *buffer,
+                        ABI::Windows::Foundation::IAsyncOperationWithProgress<UINT32,UINT32 > **operation) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE FlushAsync(
+                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream, 0x905a0fe6, 0xbc53, 0x11df, 0x8c,0x49, 0x00,0x1e,0x4f,0xc6,0x86,0xda)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CStorage_CStreams_CIOutputStreamVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *This,
+        TrustLevel *trustLevel);
+
+    /*** IOutputStream methods ***/
+    HRESULT (STDMETHODCALLTYPE *WriteAsync)(
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,
+        __FIAsyncOperationWithProgress_2_UINT32_UINT32 **operation);
+
+    HRESULT (STDMETHODCALLTYPE *FlushAsync)(
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream *This,
+        __FIAsyncOperation_1_boolean **operation);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CStorage_CStreams_CIOutputStreamVtbl;
+
+interface __x_ABI_CWindows_CStorage_CStreams_CIOutputStream {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIOutputStreamVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IOutputStream methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_WriteAsync(This,buffer,operation) (This)->lpVtbl->WriteAsync(This,buffer,operation)
+#define __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FlushAsync(This,operation) (This)->lpVtbl->FlushAsync(This,operation)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_Release(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IOutputStream methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_WriteAsync(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,__FIAsyncOperationWithProgress_2_UINT32_UINT32 **operation) {
+    return This->lpVtbl->WriteAsync(This,buffer,operation);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FlushAsync(__x_ABI_CWindows_CStorage_CStreams_CIOutputStream* This,__FIAsyncOperation_1_boolean **operation) {
+    return This->lpVtbl->FlushAsync(This,operation);
+}
+#endif
+#ifdef WIDL_using_Windows_Storage_Streams
+#define IID_IOutputStream IID___x_ABI_CWindows_CStorage_CStreams_CIOutputStream
+#define IOutputStreamVtbl __x_ABI_CWindows_CStorage_CStreams_CIOutputStreamVtbl
+#define IOutputStream __x_ABI_CWindows_CStorage_CStreams_CIOutputStream
+#define IOutputStream_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_QueryInterface
+#define IOutputStream_AddRef __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_AddRef
+#define IOutputStream_Release __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_Release
+#define IOutputStream_GetIids __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetIids
+#define IOutputStream_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetRuntimeClassName
+#define IOutputStream_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_GetTrustLevel
+#define IOutputStream_WriteAsync __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_WriteAsync
+#define IOutputStream_FlushAsync __x_ABI_CWindows_CStorage_CStreams_CIOutputStream_FlushAsync
+#endif /* WIDL_using_Windows_Storage_Streams */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CStorage_CStreams_CIOutputStream_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
  * IRandomAccessStream interface
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
@@ -1160,6 +2186,292 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*****************************************************************************
+ * IRandomAccessStreamReference interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference, 0x33ee3134, 0x1dd6, 0x4e3a, 0x80,0x67, 0xd1,0xc1,0x62,0xe8,0x64,0x2b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                MIDL_INTERFACE("33ee3134-1dd6-4e3a-8067-d1c162e8642b")
+                IRandomAccessStreamReference : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE OpenReadAsync(
+                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > **operation) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference, 0x33ee3134, 0x1dd6, 0x4e3a, 0x80,0x67, 0xd1,0xc1,0x62,0xe8,0x64,0x2b)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *This,
+        TrustLevel *trustLevel);
+
+    /*** IRandomAccessStreamReference methods ***/
+    HRESULT (STDMETHODCALLTYPE *OpenReadAsync)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference *This,
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType **operation);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceVtbl;
+
+interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IRandomAccessStreamReference methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_OpenReadAsync(This,operation) (This)->lpVtbl->OpenReadAsync(This,operation)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_Release(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IRandomAccessStreamReference methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_OpenReadAsync(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType **operation) {
+    return This->lpVtbl->OpenReadAsync(This,operation);
+}
+#endif
+#ifdef WIDL_using_Windows_Storage_Streams
+#define IID_IRandomAccessStreamReference IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference
+#define IRandomAccessStreamReferenceVtbl __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceVtbl
+#define IRandomAccessStreamReference __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference
+#define IRandomAccessStreamReference_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_QueryInterface
+#define IRandomAccessStreamReference_AddRef __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_AddRef
+#define IRandomAccessStreamReference_Release __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_Release
+#define IRandomAccessStreamReference_GetIids __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetIids
+#define IRandomAccessStreamReference_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetRuntimeClassName
+#define IRandomAccessStreamReference_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_GetTrustLevel
+#define IRandomAccessStreamReference_OpenReadAsync __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_OpenReadAsync
+#endif /* WIDL_using_Windows_Storage_Streams */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IRandomAccessStreamReferenceStatics interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics, 0x857309dc, 0x3fbf, 0x4e7d, 0x98,0x6f, 0xef,0x3b,0x1a,0x07,0xa9,0x64);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Storage {
+            namespace Streams {
+                MIDL_INTERFACE("857309dc-3fbf-4e7d-986f-ef3b1a07a964")
+                IRandomAccessStreamReferenceStatics : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE CreateFromFile(
+                        ABI::Windows::Storage::IStorageFile *file,
+                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **stream_reference) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE CreateFromUri(
+                        ABI::Windows::Foundation::IUriRuntimeClass *uri,
+                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **stream_reference) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE CreateFromStream(
+                        ABI::Windows::Storage::Streams::IRandomAccessStream *stream,
+                        ABI::Windows::Storage::Streams::IRandomAccessStreamReference **stream_reference) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics, 0x857309dc, 0x3fbf, 0x4e7d, 0x98,0x6f, 0xef,0x3b,0x1a,0x07,0xa9,0x64)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStaticsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This,
+        TrustLevel *trustLevel);
+
+    /*** IRandomAccessStreamReferenceStatics methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateFromFile)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This,
+        __x_ABI_CWindows_CStorage_CIStorageFile *file,
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFromUri)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This,
+        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFromStream)(
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *stream,
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStaticsVtbl;
+
+interface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics {
+    CONST_VTBL __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStaticsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IRandomAccessStreamReferenceStatics methods ***/
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromFile(This,file,stream_reference) (This)->lpVtbl->CreateFromFile(This,file,stream_reference)
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromUri(This,uri,stream_reference) (This)->lpVtbl->CreateFromUri(This,uri,stream_reference)
+#define __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromStream(This,stream,stream_reference) (This)->lpVtbl->CreateFromStream(This,stream,stream_reference)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_QueryInterface(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_AddRef(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_Release(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetIids(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetRuntimeClassName(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetTrustLevel(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IRandomAccessStreamReferenceStatics methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromFile(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference) {
+    return This->lpVtbl->CreateFromFile(This,file,stream_reference);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromUri(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference) {
+    return This->lpVtbl->CreateFromUri(This,uri,stream_reference);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromStream(__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStream *stream,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **stream_reference) {
+    return This->lpVtbl->CreateFromStream(This,stream,stream_reference);
+}
+#endif
+#ifdef WIDL_using_Windows_Storage_Streams
+#define IID_IRandomAccessStreamReferenceStatics IID___x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics
+#define IRandomAccessStreamReferenceStaticsVtbl __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStaticsVtbl
+#define IRandomAccessStreamReferenceStatics __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics
+#define IRandomAccessStreamReferenceStatics_QueryInterface __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_QueryInterface
+#define IRandomAccessStreamReferenceStatics_AddRef __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_AddRef
+#define IRandomAccessStreamReferenceStatics_Release __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_Release
+#define IRandomAccessStreamReferenceStatics_GetIids __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetIids
+#define IRandomAccessStreamReferenceStatics_GetRuntimeClassName __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetRuntimeClassName
+#define IRandomAccessStreamReferenceStatics_GetTrustLevel __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_GetTrustLevel
+#define IRandomAccessStreamReferenceStatics_CreateFromFile __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromFile
+#define IRandomAccessStreamReferenceStatics_CreateFromUri __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromUri
+#define IRandomAccessStreamReferenceStatics_CreateFromStream __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_CreateFromStream
+#endif /* WIDL_using_Windows_Storage_Streams */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReferenceStatics_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
  * IRandomAccessStreamWithContentType interface
  */
 #ifndef ____x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__
@@ -1319,6 +2631,38 @@
 #endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
 
 /*
+ * Class Windows.Storage.Streams.DataWriter
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Storage_Streams_DataWriter_DEFINED
+#define RUNTIMECLASS_Windows_Storage_Streams_DataWriter_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Storage_Streams_DataWriter[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','D','a','t','a','W','r','i','t','e','r',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_DataWriter[] = L"Windows.Storage.Streams.DataWriter";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_DataWriter[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','D','a','t','a','W','r','i','t','e','r',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Storage_Streams_DataWriter_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.Storage.Streams.DataWriterStoreOperation
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_Storage_Streams_DataWriterStoreOperation_DEFINED
+#define RUNTIMECLASS_Windows_Storage_Streams_DataWriterStoreOperation_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_Storage_Streams_DataWriterStoreOperation[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','D','a','t','a','W','r','i','t','e','r','S','t','o','r','e','O','p','e','r','a','t','i','o','n',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_DataWriterStoreOperation[] = L"Windows.Storage.Streams.DataWriterStoreOperation";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Storage_Streams_DataWriterStoreOperation[] = {'W','i','n','d','o','w','s','.','S','t','o','r','a','g','e','.','S','t','r','e','a','m','s','.','D','a','t','a','W','r','i','t','e','r','S','t','o','r','e','O','p','e','r','a','t','i','o','n',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_Storage_Streams_DataWriterStoreOperation_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
  * Class Windows.Storage.Streams.RandomAccessStreamReference
  */
 #if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
@@ -2091,6 +3435,98 @@
 #endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIBuffer_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
+ * IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* > interface
+ */
+#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream, 0xbcb37f4f, 0x3af4, 0x561c, 0xa9,0xe3, 0xee,0xf1,0x73,0x84,0x94,0xd7);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("bcb37f4f-3af4-561c-a9e3-eef1738494d7")
+            IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Storage::Streams::IOutputStream* >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream, 0xbcb37f4f, 0x3af4, 0x561c, 0xa9,0xe3, 0xee,0xf1,0x73,0x84,0x94,0xd7)
+#endif
+#else
+typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStreamVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream *This);
+
+    /*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream *This,
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *info,
+        AsyncStatus status);
+
+    END_INTERFACE
+} __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStreamVtbl;
+
+interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream {
+    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStreamVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Release(This) (This)->lpVtbl->Release(This)
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Release(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *info,AsyncStatus status) {
+    return This->lpVtbl->Invoke(This,info,status);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperationCompletedHandler_IOutputStream IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream
+#define IAsyncOperationCompletedHandler_IOutputStreamVtbl __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStreamVtbl
+#define IAsyncOperationCompletedHandler_IOutputStream __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream
+#define IAsyncOperationCompletedHandler_IOutputStream_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface
+#define IAsyncOperationCompletedHandler_IOutputStream_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_AddRef
+#define IAsyncOperationCompletedHandler_IOutputStream_Release __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Release
+#define IAsyncOperationCompletedHandler_IOutputStream_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
  * IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStream* > interface
  */
 #ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__
@@ -2183,6 +3619,190 @@
 #endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
+ * IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > interface
+ */
+#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference, 0x60847289, 0xea0b, 0x5df6, 0x89,0xdf, 0xf2,0xc6,0x2c,0xba,0x96,0x93);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("60847289-ea0b-5df6-89df-f2c62cba9693")
+            IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference, 0x60847289, 0xea0b, 0x5df6, 0x89,0xdf, 0xf2,0xc6,0x2c,0xba,0x96,0x93)
+#endif
+#else
+typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This);
+
+    /*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *info,
+        AsyncStatus status);
+
+    END_INTERFACE
+} __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl;
+
+interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference {
+    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release(This) (This)->lpVtbl->Release(This)
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *info,AsyncStatus status) {
+    return This->lpVtbl->Invoke(This,info,status);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperationCompletedHandler_IRandomAccessStreamReference IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamReferenceVtbl __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamReference __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamReference_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamReference_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamReference_Release __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamReference_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > interface
+ */
+#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__
+#define ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType, 0x3dddecf4, 0x1d39, 0x58e8, 0x83,0xb1, 0xdb,0xed,0x54,0x1c,0x7f,0x35);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("3dddecf4-1d39-58e8-83b1-dbed541c7f35")
+            IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType, 0x3dddecf4, 0x1d39, 0x58e8, 0x83,0xb1, 0xdb,0xed,0x54,0x1c,0x7f,0x35)
+#endif
+#else
+typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This);
+
+    /*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *info,
+        AsyncStatus status);
+
+    END_INTERFACE
+} __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl;
+
+interface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType {
+    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release(This) (This)->lpVtbl->Release(This)
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
+#define __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IAsyncOperationCompletedHandler<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *info,AsyncStatus status) {
+    return This->lpVtbl->Invoke(This,info,status);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType IID___FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentTypeVtbl __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType_Release __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release
+#define IAsyncOperationCompletedHandler_IRandomAccessStreamWithContentType_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Invoke
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
  * IAsyncOperation<ABI::Windows::Storage::Streams::IBuffer* > interface
  */
 #ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_INTERFACE_DEFINED__
@@ -2323,6 +3943,146 @@
 #endif  /* ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIBuffer_INTERFACE_DEFINED__ */
 
 /*****************************************************************************
+ * IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* > interface
+ */
+#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream, 0xe8736833, 0xd013, 0x5361, 0x97,0x7d, 0xc5,0xe9,0x99,0x34,0x68,0x0e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("e8736833-d013-5361-977d-c5e99934680e")
+            IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* > : IAsyncOperation_impl<ABI::Windows::Storage::Streams::IOutputStream* >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream, 0xe8736833, 0xd013, 0x5361, 0x97,0x7d, 0xc5,0xe9,0x99,0x34,0x68,0x0e)
+#endif
+#else
+typedef struct __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStreamVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This,
+        TrustLevel *trustLevel);
+
+    /*** IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *put_Completed)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This,
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream *handler);
+
+    HRESULT (STDMETHODCALLTYPE *get_Completed)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This,
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream **handler);
+
+    HRESULT (STDMETHODCALLTYPE *GetResults)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIOutputStream **results);
+
+    END_INTERFACE
+} __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStreamVtbl;
+
+interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream {
+    CONST_VTBL __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStreamVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_AddRef(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_Release(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetIids(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetTrustLevel(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAsyncOperation<ABI::Windows::Storage::Streams::IOutputStream* > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_put_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream *handler) {
+    return This->lpVtbl->put_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_get_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIOutputStream **handler) {
+    return This->lpVtbl->get_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetResults(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream* This,__x_ABI_CWindows_CStorage_CStreams_CIOutputStream **results) {
+    return This->lpVtbl->GetResults(This,results);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperation_IOutputStream IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream
+#define IAsyncOperation_IOutputStreamVtbl __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStreamVtbl
+#define IAsyncOperation_IOutputStream __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream
+#define IAsyncOperation_IOutputStream_QueryInterface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_QueryInterface
+#define IAsyncOperation_IOutputStream_AddRef __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_AddRef
+#define IAsyncOperation_IOutputStream_Release __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_Release
+#define IAsyncOperation_IOutputStream_GetIids __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetIids
+#define IAsyncOperation_IOutputStream_GetRuntimeClassName __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetRuntimeClassName
+#define IAsyncOperation_IOutputStream_GetTrustLevel __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetTrustLevel
+#define IAsyncOperation_IOutputStream_put_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_put_Completed
+#define IAsyncOperation_IOutputStream_get_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_get_Completed
+#define IAsyncOperation_IOutputStream_GetResults __FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_GetResults
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIOutputStream_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
  * IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStream* > interface
  */
 #ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__
@@ -2462,8 +4222,292 @@
 
 #endif  /* ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStream_INTERFACE_DEFINED__ */
 
+/*****************************************************************************
+ * IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > interface
+ */
+#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference, 0x65178d50, 0xe6a2, 0x5d16, 0xb2,0x44, 0x65,0xe9,0x72,0x5e,0x5a,0x0c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("65178d50-e6a2-5d16-b244-65e9725e5a0c")
+            IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > : IAsyncOperation_impl<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference, 0x65178d50, 0xe6a2, 0x5d16, 0xb2,0x44, 0x65,0xe9,0x72,0x5e,0x5a,0x0c)
+#endif
+#else
+typedef struct __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
+        TrustLevel *trustLevel);
+
+    /*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *put_Completed)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *handler);
+
+    HRESULT (STDMETHODCALLTYPE *get_Completed)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference **handler);
+
+    HRESULT (STDMETHODCALLTYPE *GetResults)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **results);
+
+    END_INTERFACE
+} __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl;
+
+interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference {
+    CONST_VTBL __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetIids(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetTrustLevel(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamReference* > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_put_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference *handler) {
+    return This->lpVtbl->put_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_get_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference **handler) {
+    return This->lpVtbl->get_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetResults(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamReference **results) {
+    return This->lpVtbl->GetResults(This,results);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperation_IRandomAccessStreamReference IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference
+#define IAsyncOperation_IRandomAccessStreamReferenceVtbl __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReferenceVtbl
+#define IAsyncOperation_IRandomAccessStreamReference __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference
+#define IAsyncOperation_IRandomAccessStreamReference_QueryInterface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_QueryInterface
+#define IAsyncOperation_IRandomAccessStreamReference_AddRef __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_AddRef
+#define IAsyncOperation_IRandomAccessStreamReference_Release __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_Release
+#define IAsyncOperation_IRandomAccessStreamReference_GetIids __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetIids
+#define IAsyncOperation_IRandomAccessStreamReference_GetRuntimeClassName __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetRuntimeClassName
+#define IAsyncOperation_IRandomAccessStreamReference_GetTrustLevel __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetTrustLevel
+#define IAsyncOperation_IRandomAccessStreamReference_put_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_put_Completed
+#define IAsyncOperation_IRandomAccessStreamReference_get_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_get_Completed
+#define IAsyncOperation_IRandomAccessStreamReference_GetResults __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_GetResults
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamReference_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > interface
+ */
+#ifndef ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__
+#define ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType, 0xc4a57c5e, 0x32b0, 0x55b3, 0xad,0x13, 0xce,0x1c,0x23,0x04,0x1e,0xd6);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            template<>
+            MIDL_INTERFACE("c4a57c5e-32b0-55b3-ad13-ce1c23041ed6")
+            IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > : IAsyncOperation_impl<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* >
+            {
+            };
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType, 0xc4a57c5e, 0x32b0, 0x55b3, 0xad,0x13, 0xce,0x1c,0x23,0x04,0x1e,0xd6)
+#endif
+#else
+typedef struct __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
+        TrustLevel *trustLevel);
+
+    /*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
+    HRESULT (STDMETHODCALLTYPE *put_Completed)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *handler);
+
+    HRESULT (STDMETHODCALLTYPE *get_Completed)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
+        __FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType **handler);
+
+    HRESULT (STDMETHODCALLTYPE *GetResults)(
+        __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *This,
+        __x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType **results);
+
+    END_INTERFACE
+} __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl;
+
+interface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType {
+    CONST_VTBL __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
+#define __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetIids(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetTrustLevel(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStreamWithContentType* > methods ***/
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_put_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType *handler) {
+    return This->lpVtbl->put_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_get_Completed(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,__FIAsyncOperationCompletedHandler_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType **handler) {
+    return This->lpVtbl->get_Completed(This,handler);
+}
+static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetResults(__FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType* This,__x_ABI_CWindows_CStorage_CStreams_CIRandomAccessStreamWithContentType **results) {
+    return This->lpVtbl->GetResults(This,results);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation
+#define IID_IAsyncOperation_IRandomAccessStreamWithContentType IID___FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType
+#define IAsyncOperation_IRandomAccessStreamWithContentTypeVtbl __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentTypeVtbl
+#define IAsyncOperation_IRandomAccessStreamWithContentType __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType
+#define IAsyncOperation_IRandomAccessStreamWithContentType_QueryInterface __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_QueryInterface
+#define IAsyncOperation_IRandomAccessStreamWithContentType_AddRef __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_AddRef
+#define IAsyncOperation_IRandomAccessStreamWithContentType_Release __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_Release
+#define IAsyncOperation_IRandomAccessStreamWithContentType_GetIids __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetIids
+#define IAsyncOperation_IRandomAccessStreamWithContentType_GetRuntimeClassName __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetRuntimeClassName
+#define IAsyncOperation_IRandomAccessStreamWithContentType_GetTrustLevel __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetTrustLevel
+#define IAsyncOperation_IRandomAccessStreamWithContentType_put_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_put_Completed
+#define IAsyncOperation_IRandomAccessStreamWithContentType_get_Completed __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_get_Completed
+#define IAsyncOperation_IRandomAccessStreamWithContentType_GetResults __FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_GetResults
+#endif /* WIDL_using_Windows_Foundation */
+#endif
+
+#endif
+
+#endif  /* ____FIAsyncOperation_1_Windows__CStorage__CStreams__CIRandomAccessStreamWithContentType_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 */
 
diff --git a/mingw-w64-headers/include/windows.storage.streams.idl b/mingw-w64-headers/include/windows.storage.streams.idl
index cc58a03..b3cb8db 100644
--- a/mingw-w64-headers/include/windows.storage.streams.idl
+++ b/mingw-w64-headers/include/windows.storage.streams.idl
@@ -24,11 +24,19 @@
 import "eventtoken.idl";
 import "windows.foundation.idl";
 
+namespace Windows.Storage {
+    interface IStorageFile;
+}
+
 namespace Windows.Storage.Streams {
+    typedef enum ByteOrder ByteOrder;
+    typedef enum UnicodeEncoding UnicodeEncoding;
     interface IBuffer;
     interface IBufferFactory;
     interface IBufferStatics;
     interface IContentTypeProvider;
+    interface IDataWriter;
+    interface IDataWriterFactory;
     interface IInputStream;
     interface IInputStreamReference;
     interface IOutputStream;
@@ -38,6 +46,8 @@
     interface IRandomAccessStreamStatics;
     interface IRandomAccessStreamWithContentType;
     runtimeclass Buffer;
+    runtimeclass DataWriter;
+    runtimeclass DataWriterStoreOperation;
     runtimeclass InMemoryRandomAccessStream;
     runtimeclass RandomAccessStream;
     runtimeclass RandomAccessStreamReference;
@@ -48,12 +58,37 @@
         interface Windows.Foundation.Collections.IVectorView<Windows.Storage.Streams.IRandomAccessStream *>;
         interface Windows.Foundation.Collections.IVector<Windows.Storage.Streams.IRandomAccessStream *>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.Streams.IBuffer *>;
+        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.Streams.IOutputStream *>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.Streams.IRandomAccessStream *>;
+        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.Streams.IRandomAccessStreamReference *>;
+        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.Streams.IRandomAccessStreamWithContentType *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.IBuffer *>;
+        interface Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.IOutputStream *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.IRandomAccessStream *>;
+        interface Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.IRandomAccessStreamReference *>;
+        interface Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.IRandomAccessStreamWithContentType *>;
     }
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum ByteOrder
+    {
+        LittleEndian = 0,
+        BigEndian    = 1,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum UnicodeEncoding
+    {
+        Utf8    = 0,
+        Utf16LE = 1,
+        Utf16BE = 2,
+    };
+
+    [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         uuid(905a0fe0-bc53-11df-8c49-001e4fc686da)
     ]
@@ -90,6 +125,66 @@
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(64b89265-d341-4922-b38a-dd4af8808c4e)
+    ]
+    interface IDataWriter : IInspectable
+    {
+        [propget] HRESULT UnstoredBufferLength([out, retval] UINT32 *value);
+        [propget] HRESULT UnicodeEncoding([out, retval] Windows.Storage.Streams.UnicodeEncoding *value);
+        [propput] HRESULT UnicodeEncoding([in] Windows.Storage.Streams.UnicodeEncoding value);
+        [propget] HRESULT ByteOrder([out, retval] Windows.Storage.Streams.ByteOrder *value);
+        [propput] HRESULT ByteOrder([in] Windows.Storage.Streams.ByteOrder value);
+        HRESULT WriteByte([in] BYTE value);
+        HRESULT WriteBytes([in] UINT32 value_size, [in, size_is(value_size)] BYTE *value);
+        [overload("WriteBuffer")] HRESULT WriteBuffer([in] Windows.Storage.Streams.IBuffer *buffer);
+        [overload("WriteBuffer")] HRESULT WriteBufferRange([in] Windows.Storage.Streams.IBuffer *buffer, [in] UINT32 start, [in] UINT32 count);
+        HRESULT WriteBoolean([in] boolean value);
+        HRESULT WriteGuid([in] GUID value);
+        HRESULT WriteInt16([in] INT16 value);
+        HRESULT WriteInt32([in] INT32 value);
+        HRESULT WriteInt64([in] INT64 value);
+        HRESULT WriteUInt16([in] UINT16 value);
+        HRESULT WriteUInt32([in] UINT32 value);
+        HRESULT WriteUInt64([in] UINT64 value);
+        HRESULT WriteSingle([in] FLOAT value);
+        HRESULT WriteDouble([in] DOUBLE value);
+        HRESULT WriteDateTime([in] Windows.Foundation.DateTime value);
+        HRESULT WriteTimeSpan([in] Windows.Foundation.TimeSpan value);
+        HRESULT WriteString([in] HSTRING value, [out, retval] UINT32 *code_unit_count);
+        HRESULT MeasureString([in] HSTRING value, [out, retval] UINT32 *code_unit_count);
+        HRESULT StoreAsync([out, retval] Windows.Storage.Streams.DataWriterStoreOperation **operation);
+        HRESULT FlushAsync([out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+        HRESULT DetachBuffer([out, retval] Windows.Storage.Streams.IBuffer **buffer);
+        HRESULT DetachStream([out, retval] Windows.Storage.Streams.IOutputStream **output_stream);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Storage.Streams.DataWriter),
+        uuid(338c67c2-8b84-4c2b-9c50-7b8767847a1f)
+    ]
+    interface IDataWriterFactory : IInspectable
+    {
+        HRESULT CreateDataWriter(
+            [in] Windows.Storage.Streams.IOutputStream *output_stream,
+            [out, retval] Windows.Storage.Streams.DataWriter **data_writer);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(905a0fe6-bc53-11df-8c49-001e4fc686da)
+    ]
+    interface IOutputStream : IInspectable
+        requires Windows.Foundation.IClosable
+    {
+        HRESULT WriteAsync(
+            [in] Windows.Storage.Streams.IBuffer *buffer,
+            [out, retval] Windows.Foundation.IAsyncOperationWithProgress<UINT32, UINT32> **operation);
+        HRESULT FlushAsync([out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         uuid(905a0fe1-bc53-11df-8c49-001e4fc686da),
     ]
     interface IRandomAccessStream : IInspectable
@@ -109,6 +204,33 @@
     }
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(33ee3134-1dd6-4e3a-8067-d1c162e8642b)
+    ]
+    interface IRandomAccessStreamReference : IInspectable
+    {
+        HRESULT OpenReadAsync([out, retval] Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.IRandomAccessStreamWithContentType *> **operation);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Storage.Streams.RandomAccessStreamReference),
+        uuid(857309dc-3fbf-4e7d-986f-ef3b1a07a964)
+    ]
+    interface IRandomAccessStreamReferenceStatics : IInspectable
+    {
+        HRESULT CreateFromFile(
+            [in] Windows.Storage.IStorageFile *file,
+            [out, retval] Windows.Storage.Streams.RandomAccessStreamReference **stream_reference);
+        HRESULT CreateFromUri(
+            [in] Windows.Foundation.Uri *uri,
+            [out, retval] Windows.Storage.Streams.RandomAccessStreamReference **stream_reference);
+        HRESULT CreateFromStream(
+            [in] Windows.Storage.Streams.IRandomAccessStream *stream,
+            [out, retval] Windows.Storage.Streams.RandomAccessStreamReference **stream_reference);
+    }
+
+    [
         uuid(cc254827-4b3d-438f-9232-10c76bc7e038),
     ]
     interface IRandomAccessStreamWithContentType : IInspectable
@@ -156,6 +278,28 @@
     }
 
     [
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Storage.Streams.IDataWriterFactory, Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass DataWriter
+    {
+        [default] interface Windows.Storage.Streams.IDataWriter;
+        interface Windows.Foundation.IClosable;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass DataWriterStoreOperation
+    {
+        [default] interface Windows.Foundation.IAsyncOperation<UINT32>;
+    }
+
+    [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         static(Windows.Storage.Streams.IRandomAccessStreamReferenceStatics, Windows.Foundation.UniversalApiContract, 1.0)
diff --git a/mingw-w64-headers/include/windows.ui.core.idl b/mingw-w64-headers/include/windows.ui.core.idl
index d6bbf7e..e6b4ec5 100644
--- a/mingw-w64-headers/include/windows.ui.core.idl
+++ b/mingw-w64-headers/include/windows.ui.core.idl
@@ -20,6 +20,7 @@
 #pragma winrt ns_prefix
 #endif
 
+#ifndef DO_NO_IMPORTS
 import "inspectable.idl";
 import "asyncinfo.idl";
 import "eventtoken.idl";
@@ -32,6 +33,7 @@
 /* import "windows.ui.input.inking.idl"; */
 /* import "windows.ui.input.inking.core.idl"; */
 /* import "windows.ui.popups.idl"; */
+#endif
 
 namespace Windows.UI.Input {
     runtimeclass PointerPoint;
diff --git a/mingw-w64-headers/include/windows.ui.viewmanagement.idl b/mingw-w64-headers/include/windows.ui.viewmanagement.idl
index d4a382d..7d320f3 100644
--- a/mingw-w64-headers/include/windows.ui.viewmanagement.idl
+++ b/mingw-w64-headers/include/windows.ui.viewmanagement.idl
@@ -20,6 +20,7 @@
 #pragma winrt ns_prefix
 #endif
 
+#ifndef DO_NO_IMPORTS
 import "inspectable.idl";
 import "asyncinfo.idl";
 import "eventtoken.idl";
@@ -31,6 +32,7 @@
 import "windows.ui.core.idl";
 /* import "windows.ui.popups.idl"; */
 /* import "windows.ui.windowmanagement.idl"; */
+#endif
 
 namespace Windows.UI.ViewManagement
 {
diff --git a/mingw-w64-headers/include/windows.ui.xaml.h b/mingw-w64-headers/include/windows.ui.xaml.h
new file mode 100644
index 0000000..64645c7
--- /dev/null
+++ b/mingw-w64-headers/include/windows.ui.xaml.h
@@ -0,0 +1,2582 @@
+/*** Autogenerated by WIDL 9.18 from include/windows.ui.xaml.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_ui_xaml_h__
+#define __windows_ui_xaml_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_CUI_CXaml_CICreateDefaultValueCallback_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback ABI::Windows::UI::Xaml::ICreateDefaultValueCallback
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface ICreateDefaultValueCallback;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback ABI::Windows::UI::Xaml::IDependencyPropertyChangedCallback
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyPropertyChangedCallback;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback ABI::Windows::UI::Xaml::IPropertyChangedCallback
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IPropertyChangedCallback;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey ABI::Windows::UI::Xaml::IDataTemplateKey
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDataTemplateKey;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory ABI::Windows::UI::Xaml::IDataTemplateKeyFactory
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDataTemplateKeyFactory;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject __x_ABI_CWindows_CUI_CXaml_CIDependencyObject;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject ABI::Windows::UI::Xaml::IDependencyObject
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyObject;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 ABI::Windows::UI::Xaml::IDependencyObject2
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyObject2;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory ABI::Windows::UI::Xaml::IDependencyObjectFactory
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyObjectFactory;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty ABI::Windows::UI::Xaml::IDependencyProperty
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyProperty;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs ABI::Windows::UI::Xaml::IDependencyPropertyChangedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyPropertyChangedEventArgs;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics ABI::Windows::UI::Xaml::IDependencyPropertyStatics
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyPropertyStatics;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata ABI::Windows::UI::Xaml::IPropertyMetadata
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IPropertyMetadata;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory ABI::Windows::UI::Xaml::IPropertyMetadataFactory
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IPropertyMetadataFactory;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics ABI::Windows::UI::Xaml::IPropertyMetadataStatics
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IPropertyMetadataStatics;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CDataTemplateKey_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CDataTemplateKey_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                class DataTemplateKey;
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CDataTemplateKey __x_ABI_CWindows_CUI_CXaml_CDataTemplateKey;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CUI_CXaml_CDataTemplateKey_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CDependencyObject_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CDependencyObject_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                class DependencyObject;
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CDependencyObject __x_ABI_CWindows_CUI_CXaml_CDependencyObject;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CUI_CXaml_CDependencyObject_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CDependencyProperty_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CDependencyProperty_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                class DependencyProperty;
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CDependencyProperty __x_ABI_CWindows_CUI_CXaml_CDependencyProperty;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CUI_CXaml_CDependencyProperty_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CDependencyPropertyChangedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CDependencyPropertyChangedEventArgs_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                class DependencyPropertyChangedEventArgs;
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CDependencyPropertyChangedEventArgs __x_ABI_CWindows_CUI_CXaml_CDependencyPropertyChangedEventArgs;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CUI_CXaml_CDependencyPropertyChangedEventArgs_FWD_DEFINED__ */
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CPropertyMetadata_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CPropertyMetadata_FWD_DEFINED__
+#ifdef __cplusplus
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                class PropertyMetadata;
+            }
+        }
+    }
+}
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CPropertyMetadata __x_ABI_CWindows_CUI_CXaml_CPropertyMetadata;
+#endif /* defined __cplusplus */
+#endif /* defined ____x_ABI_CWindows_CUI_CXaml_CPropertyMetadata_FWD_DEFINED__ */
+
+/* Headers for imported files */
+
+#include <inspectable.h>
+#include <asyncinfo.h>
+#include <eventtoken.h>
+#include <windowscontracts.h>
+#include <windows.foundation.h>
+#include <windows.applicationmodel.h>
+#include <windows.applicationmodel.activation.h>
+#include <windows.applicationmodel.core.h>
+#include <windows.foundation.numerics.h>
+#include <windows.graphics.imaging.h>
+#include <windows.ui.h>
+#include <windows.ui.composition.h>
+#include <windows.ui.core.h>
+#include <windows.ui.input.h>
+#include <windows.ui.xaml.interop.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey ABI::Windows::UI::Xaml::IDataTemplateKey
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDataTemplateKey;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject __x_ABI_CWindows_CUI_CXaml_CIDependencyObject;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject ABI::Windows::UI::Xaml::IDependencyObject
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyObject;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty ABI::Windows::UI::Xaml::IDependencyProperty
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyProperty;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs ABI::Windows::UI::Xaml::IDependencyPropertyChangedEventArgs
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyPropertyChangedEventArgs;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics ABI::Windows::UI::Xaml::IDependencyPropertyStatics
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IDependencyPropertyStatics;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata ABI::Windows::UI::Xaml::IPropertyMetadata
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IPropertyMetadata;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory ABI::Windows::UI::Xaml::IPropertyMetadataFactory
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IPropertyMetadataFactory;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_FWD_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_FWD_DEFINED__
+typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics;
+#ifdef __cplusplus
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics ABI::Windows::UI::Xaml::IPropertyMetadataStatics
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                interface IPropertyMetadataStatics;
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+#endif
+
+/*****************************************************************************
+ * ICreateDefaultValueCallback interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback, 0xd6ecb12c, 0x15b5, 0x4ec8, 0xb9,0x5c, 0xcd,0xd2,0x08,0xf0,0x81,0x53);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("d6ecb12c-15b5-4ec8-b95c-cdd208f08153")
+                ICreateDefaultValueCallback : public IUnknown
+                {
+                    virtual HRESULT STDMETHODCALLTYPE Invoke(
+                        IInspectable **result) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback, 0xd6ecb12c, 0x15b5, 0x4ec8, 0xb9,0x5c, 0xcd,0xd2,0x08,0xf0,0x81,0x53)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallbackVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *This);
+
+    /*** ICreateDefaultValueCallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *This,
+        IInspectable **result);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallbackVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallbackVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Release(This) (This)->lpVtbl->Release(This)
+/*** ICreateDefaultValueCallback methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Invoke(This,result) (This)->lpVtbl->Invoke(This,result)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_AddRef(__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Release(__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ICreateDefaultValueCallback methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Invoke(__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback* This,IInspectable **result) {
+    return This->lpVtbl->Invoke(This,result);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_ICreateDefaultValueCallback IID___x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback
+#define ICreateDefaultValueCallbackVtbl __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallbackVtbl
+#define ICreateDefaultValueCallback __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback
+#define ICreateDefaultValueCallback_QueryInterface __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_QueryInterface
+#define ICreateDefaultValueCallback_AddRef __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_AddRef
+#define ICreateDefaultValueCallback_Release __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Release
+#define ICreateDefaultValueCallback_Invoke __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Invoke
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDependencyPropertyChangedCallback interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback, 0x45883d16, 0x27bf, 0x4bc1, 0xac,0x26, 0x94,0xc1,0x60,0x1f,0x3a,0x49);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("45883d16-27bf-4bc1-ac26-94c1601f3a49")
+                IDependencyPropertyChangedCallback : public IUnknown
+                {
+                    virtual HRESULT STDMETHODCALLTYPE Invoke(
+                        ABI::Windows::UI::Xaml::IDependencyObject *sender,
+                        ABI::Windows::UI::Xaml::IDependencyProperty *dp) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback, 0x45883d16, 0x27bf, 0x4bc1, 0xac,0x26, 0x94,0xc1,0x60,0x1f,0x3a,0x49)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallbackVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *This);
+
+    /*** IDependencyPropertyChangedCallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *This,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *sender,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallbackVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallbackVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Release(This) (This)->lpVtbl->Release(This)
+/*** IDependencyPropertyChangedCallback methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Invoke(This,sender,dp) (This)->lpVtbl->Invoke(This,sender,dp)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDependencyPropertyChangedCallback methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Invoke(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyObject *sender,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp) {
+    return This->lpVtbl->Invoke(This,sender,dp);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IDependencyPropertyChangedCallback IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback
+#define IDependencyPropertyChangedCallbackVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallbackVtbl
+#define IDependencyPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback
+#define IDependencyPropertyChangedCallback_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_QueryInterface
+#define IDependencyPropertyChangedCallback_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_AddRef
+#define IDependencyPropertyChangedCallback_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Release
+#define IDependencyPropertyChangedCallback_Invoke __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Invoke
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IPropertyChangedCallback interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback, 0x5a9f8a25, 0xd142, 0x44a4, 0x82,0x31, 0xfd,0x67,0x67,0x24,0xf2,0x9b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("5a9f8a25-d142-44a4-8231-fd676724f29b")
+                IPropertyChangedCallback : public IUnknown
+                {
+                    virtual HRESULT STDMETHODCALLTYPE Invoke(
+                        ABI::Windows::UI::Xaml::IDependencyObject *obj,
+                        ABI::Windows::UI::Xaml::IDependencyPropertyChangedEventArgs *args) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback, 0x5a9f8a25, 0xd142, 0x44a4, 0x82,0x31, 0xfd,0x67,0x67,0x24,0xf2,0x9b)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallbackVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *This);
+
+    /*** IPropertyChangedCallback methods ***/
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *This,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *obj,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *args);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallbackVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallbackVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Release(This) (This)->lpVtbl->Release(This)
+/*** IPropertyChangedCallback methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Invoke(This,obj,args) (This)->lpVtbl->Invoke(This,obj,args)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_AddRef(__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Release(__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IPropertyChangedCallback methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Invoke(__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyObject *obj,__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *args) {
+    return This->lpVtbl->Invoke(This,obj,args);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IPropertyChangedCallback IID___x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback
+#define IPropertyChangedCallbackVtbl __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallbackVtbl
+#define IPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback
+#define IPropertyChangedCallback_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_QueryInterface
+#define IPropertyChangedCallback_AddRef __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_AddRef
+#define IPropertyChangedCallback_Release __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Release
+#define IPropertyChangedCallback_Invoke __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Invoke
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDataTemplateKey interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey, 0x873b6c28, 0xcceb, 0x4b61, 0x86,0xfa, 0xb2,0xce,0xc3,0x9c,0xc2,0xfa);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("873b6c28-cceb-4b61-86fa-b2cec39cc2fa")
+                IDataTemplateKey : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE get_DataType(
+                        IInspectable **value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE put_DataType(
+                        IInspectable *value) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey, 0x873b6c28, 0xcceb, 0x4b61, 0x86,0xfa, 0xb2,0xce,0xc3,0x9c,0xc2,0xfa)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
+        TrustLevel *trustLevel);
+
+    /*** IDataTemplateKey methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_DataType)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *put_DataType)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
+        IInspectable *value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDataTemplateKey methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_get_DataType(This,value) (This)->lpVtbl->get_DataType(This,value)
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_put_DataType(This,value) (This)->lpVtbl->put_DataType(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_Release(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDataTemplateKey methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_get_DataType(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,IInspectable **value) {
+    return This->lpVtbl->get_DataType(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_put_DataType(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,IInspectable *value) {
+    return This->lpVtbl->put_DataType(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IDataTemplateKey IID___x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey
+#define IDataTemplateKeyVtbl __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyVtbl
+#define IDataTemplateKey __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey
+#define IDataTemplateKey_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_QueryInterface
+#define IDataTemplateKey_AddRef __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_AddRef
+#define IDataTemplateKey_Release __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_Release
+#define IDataTemplateKey_GetIids __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetIids
+#define IDataTemplateKey_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetRuntimeClassName
+#define IDataTemplateKey_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetTrustLevel
+#define IDataTemplateKey_get_DataType __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_get_DataType
+#define IDataTemplateKey_put_DataType __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_put_DataType
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDataTemplateKeyFactory interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory, 0xe96b2959, 0xd982, 0x4152, 0x91,0xcb, 0xde,0x0e,0x4d,0xfd,0x76,0x93);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("e96b2959-d982-4152-91cb-de0e4dfd7693")
+                IDataTemplateKeyFactory : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
+                        IInspectable *base_interface,
+                        IInspectable **inner_interface,
+                        ABI::Windows::UI::Xaml::IDataTemplateKey **value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE CreateInstanceWithType(
+                        IInspectable *data_type,
+                        IInspectable *base_interface,
+                        IInspectable **inner_interface,
+                        ABI::Windows::UI::Xaml::IDataTemplateKey **value) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory, 0xe96b2959, 0xd982, 0x4152, 0x91,0xcb, 0xde,0x0e,0x4d,0xfd,0x76,0x93)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactoryVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
+        TrustLevel *trustLevel);
+
+    /*** IDataTemplateKeyFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
+        IInspectable *base_interface,
+        IInspectable **inner_interface,
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey **value);
+
+    HRESULT (STDMETHODCALLTYPE *CreateInstanceWithType)(
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
+        IInspectable *data_type,
+        IInspectable *base_interface,
+        IInspectable **inner_interface,
+        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactoryVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactoryVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDataTemplateKeyFactory methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstance(This,base_interface,inner_interface,value) (This)->lpVtbl->CreateInstance(This,base_interface,inner_interface,value)
+#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstanceWithType(This,data_type,base_interface,inner_interface,value) (This)->lpVtbl->CreateInstanceWithType(This,data_type,base_interface,inner_interface,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_Release(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDataTemplateKeyFactory methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstance(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,IInspectable *base_interface,IInspectable **inner_interface,__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey **value) {
+    return This->lpVtbl->CreateInstance(This,base_interface,inner_interface,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstanceWithType(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,IInspectable *data_type,IInspectable *base_interface,IInspectable **inner_interface,__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey **value) {
+    return This->lpVtbl->CreateInstanceWithType(This,data_type,base_interface,inner_interface,value);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IDataTemplateKeyFactory IID___x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory
+#define IDataTemplateKeyFactoryVtbl __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactoryVtbl
+#define IDataTemplateKeyFactory __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory
+#define IDataTemplateKeyFactory_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_QueryInterface
+#define IDataTemplateKeyFactory_AddRef __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_AddRef
+#define IDataTemplateKeyFactory_Release __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_Release
+#define IDataTemplateKeyFactory_GetIids __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetIids
+#define IDataTemplateKeyFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetRuntimeClassName
+#define IDataTemplateKeyFactory_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetTrustLevel
+#define IDataTemplateKeyFactory_CreateInstance __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstance
+#define IDataTemplateKeyFactory_CreateInstanceWithType __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstanceWithType
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDependencyObject interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObject, 0x5c526665, 0xf60e, 0x4912, 0xaf,0x59, 0x5f,0xe0,0x68,0x0f,0x08,0x9d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("5c526665-f60e-4912-af59-5fe0680f089d")
+                IDependencyObject : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE GetValue(
+                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
+                        IInspectable **result) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE SetValue(
+                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
+                        IInspectable *value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE ClearValue(
+                        ABI::Windows::UI::Xaml::IDependencyProperty *dp) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE ReadLocalValue(
+                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
+                        IInspectable **result) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE GetAnimationBaseValue(
+                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
+                        IInspectable **result) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_Dispatcher(
+                        ABI::Windows::UI::Core::ICoreDispatcher **value) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject, 0x5c526665, 0xf60e, 0x4912, 0xaf,0x59, 0x5f,0xe0,0x68,0x0f,0x08,0x9d)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
+        TrustLevel *trustLevel);
+
+    /*** IDependencyObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
+        IInspectable **result);
+
+    HRESULT (STDMETHODCALLTYPE *SetValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
+        IInspectable *value);
+
+    HRESULT (STDMETHODCALLTYPE *ClearValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp);
+
+    HRESULT (STDMETHODCALLTYPE *ReadLocalValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
+        IInspectable **result);
+
+    HRESULT (STDMETHODCALLTYPE *GetAnimationBaseValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
+        IInspectable **result);
+
+    HRESULT (STDMETHODCALLTYPE *get_Dispatcher)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
+        __x_ABI_CWindows_CUI_CCore_CICoreDispatcher **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDependencyObject methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetValue(This,dp,result) (This)->lpVtbl->GetValue(This,dp,result)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_SetValue(This,dp,value) (This)->lpVtbl->SetValue(This,dp,value)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ClearValue(This,dp) (This)->lpVtbl->ClearValue(This,dp)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ReadLocalValue(This,dp,result) (This)->lpVtbl->ReadLocalValue(This,dp,result)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetAnimationBaseValue(This,dp,result) (This)->lpVtbl->GetAnimationBaseValue(This,dp,result)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_get_Dispatcher(This,value) (This)->lpVtbl->get_Dispatcher(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDependencyObject methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,IInspectable **result) {
+    return This->lpVtbl->GetValue(This,dp,result);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_SetValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,IInspectable *value) {
+    return This->lpVtbl->SetValue(This,dp,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ClearValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp) {
+    return This->lpVtbl->ClearValue(This,dp);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ReadLocalValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,IInspectable **result) {
+    return This->lpVtbl->ReadLocalValue(This,dp,result);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetAnimationBaseValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,IInspectable **result) {
+    return This->lpVtbl->GetAnimationBaseValue(This,dp,result);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_get_Dispatcher(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CCore_CICoreDispatcher **value) {
+    return This->lpVtbl->get_Dispatcher(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IDependencyObject IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObject
+#define IDependencyObjectVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectVtbl
+#define IDependencyObject __x_ABI_CWindows_CUI_CXaml_CIDependencyObject
+#define IDependencyObject_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_QueryInterface
+#define IDependencyObject_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_AddRef
+#define IDependencyObject_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_Release
+#define IDependencyObject_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetIids
+#define IDependencyObject_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetRuntimeClassName
+#define IDependencyObject_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetTrustLevel
+#define IDependencyObject_GetValue __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetValue
+#define IDependencyObject_SetValue __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_SetValue
+#define IDependencyObject_ClearValue __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ClearValue
+#define IDependencyObject_ReadLocalValue __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ReadLocalValue
+#define IDependencyObject_GetAnimationBaseValue __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetAnimationBaseValue
+#define IDependencyObject_get_Dispatcher __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_get_Dispatcher
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDependencyObject2 interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObject2, 0x29fed85d, 0x3d22, 0x43a1, 0xad,0xd0, 0x17,0x02,0x7c,0x08,0xb2,0x12);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("29fed85d-3d22-43a1-add0-17027c08b212")
+                IDependencyObject2 : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE RegisterPropertyChangedCallback(
+                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
+                        ABI::Windows::UI::Xaml::IDependencyPropertyChangedCallback *callback,
+                        INT64 *result) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE UnregisterPropertyChangedCallback(
+                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
+                        INT64 token) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2, 0x29fed85d, 0x3d22, 0x43a1, 0xad,0xd0, 0x17,0x02,0x7c,0x08,0xb2,0x12)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
+        TrustLevel *trustLevel);
+
+    /*** IDependencyObject2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *RegisterPropertyChangedCallback)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *callback,
+        INT64 *result);
+
+    HRESULT (STDMETHODCALLTYPE *UnregisterPropertyChangedCallback)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
+        INT64 token);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2Vtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDependencyObject2 methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_RegisterPropertyChangedCallback(This,dp,callback,result) (This)->lpVtbl->RegisterPropertyChangedCallback(This,dp,callback,result)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_UnregisterPropertyChangedCallback(This,dp,token) (This)->lpVtbl->UnregisterPropertyChangedCallback(This,dp,token)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDependencyObject2 methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_RegisterPropertyChangedCallback(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *callback,INT64 *result) {
+    return This->lpVtbl->RegisterPropertyChangedCallback(This,dp,callback,result);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_UnregisterPropertyChangedCallback(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,INT64 token) {
+    return This->lpVtbl->UnregisterPropertyChangedCallback(This,dp,token);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IDependencyObject2 IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObject2
+#define IDependencyObject2Vtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2Vtbl
+#define IDependencyObject2 __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2
+#define IDependencyObject2_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_QueryInterface
+#define IDependencyObject2_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_AddRef
+#define IDependencyObject2_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_Release
+#define IDependencyObject2_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetIids
+#define IDependencyObject2_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetRuntimeClassName
+#define IDependencyObject2_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetTrustLevel
+#define IDependencyObject2_RegisterPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_RegisterPropertyChangedCallback
+#define IDependencyObject2_UnregisterPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_UnregisterPropertyChangedCallback
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDependencyObjectFactory interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory, 0x9a03af92, 0x7d8a, 0x4937, 0x88,0x4f, 0xec,0xf3,0x4f,0xe0,0x2a,0xcb);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("9a03af92-7d8a-4937-884f-ecf34fe02acb")
+                IDependencyObjectFactory : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
+                        IInspectable *base_interface,
+                        IInspectable **inner_interface,
+                        ABI::Windows::UI::Xaml::IDependencyObject **value) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory, 0x9a03af92, 0x7d8a, 0x4937, 0x88,0x4f, 0xec,0xf3,0x4f,0xe0,0x2a,0xcb)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactoryVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This,
+        TrustLevel *trustLevel);
+
+    /*** IDependencyObjectFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This,
+        IInspectable *base_interface,
+        IInspectable **inner_interface,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactoryVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactoryVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDependencyObjectFactory methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_CreateInstance(This,base_interface,inner_interface,value) (This)->lpVtbl->CreateInstance(This,base_interface,inner_interface,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDependencyObjectFactory methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_CreateInstance(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This,IInspectable *base_interface,IInspectable **inner_interface,__x_ABI_CWindows_CUI_CXaml_CIDependencyObject **value) {
+    return This->lpVtbl->CreateInstance(This,base_interface,inner_interface,value);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IDependencyObjectFactory IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory
+#define IDependencyObjectFactoryVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactoryVtbl
+#define IDependencyObjectFactory __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory
+#define IDependencyObjectFactory_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_QueryInterface
+#define IDependencyObjectFactory_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_AddRef
+#define IDependencyObjectFactory_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_Release
+#define IDependencyObjectFactory_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetIids
+#define IDependencyObjectFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetRuntimeClassName
+#define IDependencyObjectFactory_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetTrustLevel
+#define IDependencyObjectFactory_CreateInstance __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_CreateInstance
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDependencyProperty interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyProperty, 0x85b13970, 0x9bc4, 0x4e96, 0xac,0xf1, 0x30,0xc8,0xfd,0x3d,0x55,0xc8);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("85b13970-9bc4-4e96-acf1-30c8fd3d55c8")
+                IDependencyProperty : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE GetMetadata(
+                        ABI::Windows::UI::Xaml::Interop::TypeName type,
+                        ABI::Windows::UI::Xaml::IPropertyMetadata **result) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty, 0x85b13970, 0x9bc4, 0x4e96, 0xac,0xf1, 0x30,0xc8,0xfd,0x3d,0x55,0xc8)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This,
+        TrustLevel *trustLevel);
+
+    /*** IDependencyProperty methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetMetadata)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This,
+        __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName type,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDependencyProperty methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetMetadata(This,type,result) (This)->lpVtbl->GetMetadata(This,type,result)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDependencyProperty methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetMetadata(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This,__x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName type,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result) {
+    return This->lpVtbl->GetMetadata(This,type,result);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IDependencyProperty IID___x_ABI_CWindows_CUI_CXaml_CIDependencyProperty
+#define IDependencyPropertyVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyVtbl
+#define IDependencyProperty __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty
+#define IDependencyProperty_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_QueryInterface
+#define IDependencyProperty_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_AddRef
+#define IDependencyProperty_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_Release
+#define IDependencyProperty_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetIids
+#define IDependencyProperty_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetRuntimeClassName
+#define IDependencyProperty_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetTrustLevel
+#define IDependencyProperty_GetMetadata __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetMetadata
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDependencyPropertyChangedEventArgs interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs, 0x81212c2b, 0x24d0, 0x4957, 0xab,0xc3, 0x22,0x44,0x70,0xa9,0x3a,0x4e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("81212c2b-24d0-4957-abc3-224470a93a4e")
+                IDependencyPropertyChangedEventArgs : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE get_Property(
+                        ABI::Windows::UI::Xaml::IDependencyProperty **value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_OldValue(
+                        IInspectable **value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_NewValue(
+                        IInspectable **value) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs, 0x81212c2b, 0x24d0, 0x4957, 0xab,0xc3, 0x22,0x44,0x70,0xa9,0x3a,0x4e)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
+        TrustLevel *trustLevel);
+
+    /*** IDependencyPropertyChangedEventArgs methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Property)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_OldValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_NewValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
+        IInspectable **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgsVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDependencyPropertyChangedEventArgs methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_Property(This,value) (This)->lpVtbl->get_Property(This,value)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_OldValue(This,value) (This)->lpVtbl->get_OldValue(This,value)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_NewValue(This,value) (This)->lpVtbl->get_NewValue(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDependencyPropertyChangedEventArgs methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_Property(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **value) {
+    return This->lpVtbl->get_Property(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_OldValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,IInspectable **value) {
+    return This->lpVtbl->get_OldValue(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_NewValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,IInspectable **value) {
+    return This->lpVtbl->get_NewValue(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IDependencyPropertyChangedEventArgs IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs
+#define IDependencyPropertyChangedEventArgsVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgsVtbl
+#define IDependencyPropertyChangedEventArgs __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs
+#define IDependencyPropertyChangedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_QueryInterface
+#define IDependencyPropertyChangedEventArgs_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_AddRef
+#define IDependencyPropertyChangedEventArgs_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_Release
+#define IDependencyPropertyChangedEventArgs_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetIids
+#define IDependencyPropertyChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetRuntimeClassName
+#define IDependencyPropertyChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetTrustLevel
+#define IDependencyPropertyChangedEventArgs_get_Property __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_Property
+#define IDependencyPropertyChangedEventArgs_get_OldValue __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_OldValue
+#define IDependencyPropertyChangedEventArgs_get_NewValue __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_NewValue
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IDependencyPropertyStatics interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics, 0x49e5f28f, 0x8259, 0x4d5c, 0xaa,0xe0, 0x83,0xd5,0x6d,0xbb,0x68,0xd9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("49e5f28f-8259-4d5c-aae0-83d56dbb68d9")
+                IDependencyPropertyStatics : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE get_UnsetValue(
+                        IInspectable **value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE Register(
+                        HSTRING name,
+                        ABI::Windows::UI::Xaml::Interop::TypeName property_type,
+                        ABI::Windows::UI::Xaml::Interop::TypeName owner_type,
+                        ABI::Windows::UI::Xaml::IPropertyMetadata *type_metadata,
+                        ABI::Windows::UI::Xaml::IDependencyProperty **result) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE RegisterAttached(
+                        HSTRING name,
+                        ABI::Windows::UI::Xaml::Interop::TypeName property_type,
+                        ABI::Windows::UI::Xaml::Interop::TypeName owner_type,
+                        ABI::Windows::UI::Xaml::IPropertyMetadata *default_metadata,
+                        ABI::Windows::UI::Xaml::IDependencyProperty **result) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics, 0x49e5f28f, 0x8259, 0x4d5c, 0xaa,0xe0, 0x83,0xd5,0x6d,0xbb,0x68,0xd9)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStaticsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
+        TrustLevel *trustLevel);
+
+    /*** IDependencyPropertyStatics methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_UnsetValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *Register)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
+        HSTRING name,
+        __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName property_type,
+        __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName owner_type,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *type_metadata,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **result);
+
+    HRESULT (STDMETHODCALLTYPE *RegisterAttached)(
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
+        HSTRING name,
+        __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName property_type,
+        __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName owner_type,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *default_metadata,
+        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **result);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStaticsVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStaticsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IDependencyPropertyStatics methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_get_UnsetValue(This,value) (This)->lpVtbl->get_UnsetValue(This,value)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Register(This,name,property_type,owner_type,type_metadata,result) (This)->lpVtbl->Register(This,name,property_type,owner_type,type_metadata,result)
+#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_RegisterAttached(This,name,property_type,owner_type,default_metadata,result) (This)->lpVtbl->RegisterAttached(This,name,property_type,owner_type,default_metadata,result)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IDependencyPropertyStatics methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_get_UnsetValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,IInspectable **value) {
+    return This->lpVtbl->get_UnsetValue(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Register(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,HSTRING name,__x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName property_type,__x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName owner_type,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *type_metadata,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **result) {
+    return This->lpVtbl->Register(This,name,property_type,owner_type,type_metadata,result);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_RegisterAttached(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,HSTRING name,__x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName property_type,__x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName owner_type,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *default_metadata,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **result) {
+    return This->lpVtbl->RegisterAttached(This,name,property_type,owner_type,default_metadata,result);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IDependencyPropertyStatics IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics
+#define IDependencyPropertyStaticsVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStaticsVtbl
+#define IDependencyPropertyStatics __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics
+#define IDependencyPropertyStatics_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_QueryInterface
+#define IDependencyPropertyStatics_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_AddRef
+#define IDependencyPropertyStatics_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Release
+#define IDependencyPropertyStatics_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetIids
+#define IDependencyPropertyStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetRuntimeClassName
+#define IDependencyPropertyStatics_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetTrustLevel
+#define IDependencyPropertyStatics_get_UnsetValue __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_get_UnsetValue
+#define IDependencyPropertyStatics_Register __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Register
+#define IDependencyPropertyStatics_RegisterAttached __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_RegisterAttached
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IPropertyMetadata interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata, 0x814ef30d, 0x8d18, 0x448a, 0x86,0x44, 0xf2,0xcb,0x51,0xe7,0x03,0x80);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("814ef30d-8d18-448a-8644-f2cb51e70380")
+                IPropertyMetadata : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE get_DefaultValue(
+                        IInspectable **value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE get_CreateDefaultValueCallback(
+                        ABI::Windows::UI::Xaml::ICreateDefaultValueCallback **value) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata, 0x814ef30d, 0x8d18, 0x448a, 0x86,0x44, 0xf2,0xcb,0x51,0xe7,0x03,0x80)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
+        TrustLevel *trustLevel);
+
+    /*** IPropertyMetadata methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_DefaultValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
+        IInspectable **value);
+
+    HRESULT (STDMETHODCALLTYPE *get_CreateDefaultValueCallback)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
+        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IPropertyMetadata methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_DefaultValue(This,value) (This)->lpVtbl->get_DefaultValue(This,value)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_CreateDefaultValueCallback(This,value) (This)->lpVtbl->get_CreateDefaultValueCallback(This,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_AddRef(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_Release(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetIids(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IPropertyMetadata methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_DefaultValue(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,IInspectable **value) {
+    return This->lpVtbl->get_DefaultValue(This,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_CreateDefaultValueCallback(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback **value) {
+    return This->lpVtbl->get_CreateDefaultValueCallback(This,value);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IPropertyMetadata IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata
+#define IPropertyMetadataVtbl __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataVtbl
+#define IPropertyMetadata __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata
+#define IPropertyMetadata_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_QueryInterface
+#define IPropertyMetadata_AddRef __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_AddRef
+#define IPropertyMetadata_Release __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_Release
+#define IPropertyMetadata_GetIids __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetIids
+#define IPropertyMetadata_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetRuntimeClassName
+#define IPropertyMetadata_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetTrustLevel
+#define IPropertyMetadata_get_DefaultValue __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_DefaultValue
+#define IPropertyMetadata_get_CreateDefaultValueCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_CreateDefaultValueCallback
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IPropertyMetadataFactory interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory, 0xc1b81cc0, 0x57cd, 0x4f2f, 0xb0,0xa9, 0xe1,0x80,0x1b,0x28,0xf7,0x6b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("c1b81cc0-57cd-4f2f-b0a9-e1801b28f76b")
+                IPropertyMetadataFactory : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE CreateInstanceWithDefaultValue(
+                        IInspectable *default_value,
+                        IInspectable *base_interface,
+                        IInspectable **inner_interface,
+                        ABI::Windows::UI::Xaml::IPropertyMetadata **value) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE CreateInstanceWithDefaultValueAndCallback(
+                        IInspectable *default_value,
+                        ABI::Windows::UI::Xaml::IPropertyChangedCallback *property_changed_callback,
+                        IInspectable *base_interface,
+                        IInspectable **inner_interface,
+                        ABI::Windows::UI::Xaml::IPropertyMetadata **value) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory, 0xc1b81cc0, 0x57cd, 0x4f2f, 0xb0,0xa9, 0xe1,0x80,0x1b,0x28,0xf7,0x6b)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactoryVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
+        TrustLevel *trustLevel);
+
+    /*** IPropertyMetadataFactory methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateInstanceWithDefaultValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
+        IInspectable *default_value,
+        IInspectable *base_interface,
+        IInspectable **inner_interface,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **value);
+
+    HRESULT (STDMETHODCALLTYPE *CreateInstanceWithDefaultValueAndCallback)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
+        IInspectable *default_value,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,
+        IInspectable *base_interface,
+        IInspectable **inner_interface,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **value);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactoryVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactoryVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IPropertyMetadataFactory methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValue(This,default_value,base_interface,inner_interface,value) (This)->lpVtbl->CreateInstanceWithDefaultValue(This,default_value,base_interface,inner_interface,value)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValueAndCallback(This,default_value,property_changed_callback,base_interface,inner_interface,value) (This)->lpVtbl->CreateInstanceWithDefaultValueAndCallback(This,default_value,property_changed_callback,base_interface,inner_interface,value)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_AddRef(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_Release(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetIids(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IPropertyMetadataFactory methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValue(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,IInspectable *default_value,IInspectable *base_interface,IInspectable **inner_interface,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **value) {
+    return This->lpVtbl->CreateInstanceWithDefaultValue(This,default_value,base_interface,inner_interface,value);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValueAndCallback(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,IInspectable *default_value,__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,IInspectable *base_interface,IInspectable **inner_interface,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **value) {
+    return This->lpVtbl->CreateInstanceWithDefaultValueAndCallback(This,default_value,property_changed_callback,base_interface,inner_interface,value);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IPropertyMetadataFactory IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory
+#define IPropertyMetadataFactoryVtbl __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactoryVtbl
+#define IPropertyMetadataFactory __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory
+#define IPropertyMetadataFactory_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_QueryInterface
+#define IPropertyMetadataFactory_AddRef __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_AddRef
+#define IPropertyMetadataFactory_Release __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_Release
+#define IPropertyMetadataFactory_GetIids __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetIids
+#define IPropertyMetadataFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetRuntimeClassName
+#define IPropertyMetadataFactory_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetTrustLevel
+#define IPropertyMetadataFactory_CreateInstanceWithDefaultValue __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValue
+#define IPropertyMetadataFactory_CreateInstanceWithDefaultValueAndCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValueAndCallback
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*****************************************************************************
+ * IPropertyMetadataStatics interface
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics, 0x3b01077a, 0x6e06, 0x45e9, 0x8b,0x5c, 0xaf,0x24,0x34,0x58,0xc0,0x62);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                MIDL_INTERFACE("3b01077a-6e06-45e9-8b5c-af243458c062")
+                IPropertyMetadataStatics : public IInspectable
+                {
+                    virtual HRESULT STDMETHODCALLTYPE CreateWithDefaultValue(
+                        IInspectable *default_value,
+                        ABI::Windows::UI::Xaml::IPropertyMetadata **result) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE CreateWithDefaultValueAndCallback(
+                        IInspectable *default_value,
+                        ABI::Windows::UI::Xaml::IPropertyChangedCallback *property_changed_callback,
+                        ABI::Windows::UI::Xaml::IPropertyMetadata **result) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE CreateWithFactory(
+                        ABI::Windows::UI::Xaml::ICreateDefaultValueCallback *create_default_value_callback,
+                        ABI::Windows::UI::Xaml::IPropertyMetadata **result) = 0;
+
+                    virtual HRESULT STDMETHODCALLTYPE CreateWithFactoryAndCallback(
+                        ABI::Windows::UI::Xaml::ICreateDefaultValueCallback *create_default_value_callback,
+                        ABI::Windows::UI::Xaml::IPropertyChangedCallback *property_changed_callback,
+                        ABI::Windows::UI::Xaml::IPropertyMetadata **result) = 0;
+
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics, 0x3b01077a, 0x6e06, 0x45e9, 0x8b,0x5c, 0xaf,0x24,0x34,0x58,0xc0,0x62)
+#endif
+#else
+typedef struct __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStaticsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
+        TrustLevel *trustLevel);
+
+    /*** IPropertyMetadataStatics methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateWithDefaultValue)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
+        IInspectable *default_value,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result);
+
+    HRESULT (STDMETHODCALLTYPE *CreateWithDefaultValueAndCallback)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
+        IInspectable *default_value,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result);
+
+    HRESULT (STDMETHODCALLTYPE *CreateWithFactory)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
+        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *create_default_value_callback,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result);
+
+    HRESULT (STDMETHODCALLTYPE *CreateWithFactoryAndCallback)(
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
+        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *create_default_value_callback,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,
+        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result);
+
+    END_INTERFACE
+} __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStaticsVtbl;
+
+interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics {
+    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStaticsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IPropertyMetadataStatics methods ***/
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValue(This,default_value,result) (This)->lpVtbl->CreateWithDefaultValue(This,default_value,result)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValueAndCallback(This,default_value,property_changed_callback,result) (This)->lpVtbl->CreateWithDefaultValueAndCallback(This,default_value,property_changed_callback,result)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactory(This,create_default_value_callback,result) (This)->lpVtbl->CreateWithFactory(This,create_default_value_callback,result)
+#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactoryAndCallback(This,create_default_value_callback,property_changed_callback,result) (This)->lpVtbl->CreateWithFactoryAndCallback(This,create_default_value_callback,property_changed_callback,result)
+#else
+/*** IUnknown methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_AddRef(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_Release(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetIids(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IPropertyMetadataStatics methods ***/
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValue(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,IInspectable *default_value,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result) {
+    return This->lpVtbl->CreateWithDefaultValue(This,default_value,result);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValueAndCallback(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,IInspectable *default_value,__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result) {
+    return This->lpVtbl->CreateWithDefaultValueAndCallback(This,default_value,property_changed_callback,result);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactory(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *create_default_value_callback,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result) {
+    return This->lpVtbl->CreateWithFactory(This,create_default_value_callback,result);
+}
+static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactoryAndCallback(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *create_default_value_callback,__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result) {
+    return This->lpVtbl->CreateWithFactoryAndCallback(This,create_default_value_callback,property_changed_callback,result);
+}
+#endif
+#ifdef WIDL_using_Windows_UI_Xaml
+#define IID_IPropertyMetadataStatics IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics
+#define IPropertyMetadataStaticsVtbl __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStaticsVtbl
+#define IPropertyMetadataStatics __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics
+#define IPropertyMetadataStatics_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_QueryInterface
+#define IPropertyMetadataStatics_AddRef __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_AddRef
+#define IPropertyMetadataStatics_Release __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_Release
+#define IPropertyMetadataStatics_GetIids __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetIids
+#define IPropertyMetadataStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetRuntimeClassName
+#define IPropertyMetadataStatics_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetTrustLevel
+#define IPropertyMetadataStatics_CreateWithDefaultValue __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValue
+#define IPropertyMetadataStatics_CreateWithDefaultValueAndCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValueAndCallback
+#define IPropertyMetadataStatics_CreateWithFactory __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactory
+#define IPropertyMetadataStatics_CreateWithFactoryAndCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactoryAndCallback
+#endif /* WIDL_using_Windows_UI_Xaml */
+#endif
+
+#endif
+
+#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_INTERFACE_DEFINED__ */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.UI.Xaml.DataTemplateKey
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_UI_Xaml_DataTemplateKey_DEFINED
+#define RUNTIMECLASS_Windows_UI_Xaml_DataTemplateKey_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_UI_Xaml_DataTemplateKey[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','a','t','a','T','e','m','p','l','a','t','e','K','e','y',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DataTemplateKey[] = L"Windows.UI.Xaml.DataTemplateKey";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DataTemplateKey[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','a','t','a','T','e','m','p','l','a','t','e','K','e','y',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_UI_Xaml_DataTemplateKey_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.UI.Xaml.DependencyObject
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_UI_Xaml_DependencyObject_DEFINED
+#define RUNTIMECLASS_Windows_UI_Xaml_DependencyObject_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_UI_Xaml_DependencyObject[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','O','b','j','e','c','t',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyObject[] = L"Windows.UI.Xaml.DependencyObject";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyObject[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','O','b','j','e','c','t',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_UI_Xaml_DependencyObject_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.UI.Xaml.DependencyProperty
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_UI_Xaml_DependencyProperty_DEFINED
+#define RUNTIMECLASS_Windows_UI_Xaml_DependencyProperty_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_UI_Xaml_DependencyProperty[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','P','r','o','p','e','r','t','y',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyProperty[] = L"Windows.UI.Xaml.DependencyProperty";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyProperty[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','P','r','o','p','e','r','t','y',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_UI_Xaml_DependencyProperty_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.UI.Xaml.DependencyPropertyChangedEventArgs
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_UI_Xaml_DependencyPropertyChangedEventArgs_DEFINED
+#define RUNTIMECLASS_Windows_UI_Xaml_DependencyPropertyChangedEventArgs_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_UI_Xaml_DependencyPropertyChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','P','r','o','p','e','r','t','y','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyPropertyChangedEventArgs[] = L"Windows.UI.Xaml.DependencyPropertyChangedEventArgs";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyPropertyChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','P','r','o','p','e','r','t','y','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_UI_Xaml_DependencyPropertyChangedEventArgs_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/*
+ * Class Windows.UI.Xaml.PropertyMetadata
+ */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifndef RUNTIMECLASS_Windows_UI_Xaml_PropertyMetadata_DEFINED
+#define RUNTIMECLASS_Windows_UI_Xaml_PropertyMetadata_DEFINED
+#if !defined(_MSC_VER) && !defined(__MINGW32__)
+static const WCHAR RuntimeClass_Windows_UI_Xaml_PropertyMetadata[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','P','r','o','p','e','r','t','y','M','e','t','a','d','a','t','a',0};
+#elif defined(__GNUC__) && !defined(__cplusplus)
+const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_PropertyMetadata[] = L"Windows.UI.Xaml.PropertyMetadata";
+#else
+extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_PropertyMetadata[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','P','r','o','p','e','r','t','y','M','e','t','a','d','a','t','a',0};
+#endif
+#endif /* RUNTIMECLASS_Windows_UI_Xaml_PropertyMetadata_DEFINED */
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+
+/* 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_ui_xaml_h__ */
diff --git a/mingw-w64-headers/include/windows.ui.xaml.idl b/mingw-w64-headers/include/windows.ui.xaml.idl
new file mode 100644
index 0000000..e143597
--- /dev/null
+++ b/mingw-w64-headers/include/windows.ui.xaml.idl
@@ -0,0 +1,255 @@
+/*
+ * Copyright 2024 Zhiyi Zhang for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+import "inspectable.idl";
+import "asyncinfo.idl";
+import "eventtoken.idl";
+import "windowscontracts.idl";
+import "windows.foundation.idl";
+import "windows.applicationmodel.idl";
+import "windows.applicationmodel.activation.idl";
+import "windows.applicationmodel.core.idl";
+import "windows.foundation.numerics.idl";
+import "windows.graphics.imaging.idl";
+import "windows.ui.idl";
+import "windows.ui.composition.idl";
+import "windows.ui.core.idl";
+import "windows.ui.input.idl";
+import "windows.ui.xaml.interop.idl";
+
+namespace Windows.UI.Xaml {
+    interface IDataTemplateKey;
+    interface IDependencyObject;
+    interface IDependencyProperty;
+    interface IDependencyPropertyChangedEventArgs;
+    interface IDependencyPropertyStatics;
+    interface IPropertyMetadata;
+    interface IPropertyMetadataFactory;
+    interface IPropertyMetadataStatics;
+
+    runtimeclass DataTemplateKey;
+    runtimeclass DependencyObject;
+    runtimeclass DependencyProperty;
+    runtimeclass DependencyPropertyChangedEventArgs;
+    runtimeclass PropertyMetadata;
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(d6ecb12c-15b5-4ec8-b95c-cdd208f08153)
+    ]
+    delegate HRESULT CreateDefaultValueCallback([out, retval] IInspectable **result);
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(45883d16-27bf-4bc1-ac26-94c1601f3a49)
+    ]
+    delegate HRESULT DependencyPropertyChangedCallback([in] Windows.UI.Xaml.DependencyObject *sender, [in] Windows.UI.Xaml.DependencyProperty *dp);
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(5a9f8a25-d142-44a4-8231-fd676724f29b)
+    ]
+    delegate HRESULT PropertyChangedCallback([in] Windows.UI.Xaml.DependencyObject *obj, [in] Windows.UI.Xaml.DependencyPropertyChangedEventArgs *args);
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.DataTemplateKey),
+        uuid(873b6c28-cceb-4b61-86fa-b2cec39cc2fa)
+    ]
+    interface IDataTemplateKey : IInspectable
+    {
+        [propget] HRESULT DataType([out, retval] IInspectable **value);
+        [propput] HRESULT DataType([in] IInspectable *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.DataTemplateKey),
+        uuid(e96b2959-d982-4152-91cb-de0e4dfd7693)
+    ]
+    interface IDataTemplateKeyFactory : IInspectable
+    {
+        HRESULT CreateInstance([in] IInspectable *base_interface, [out] IInspectable **inner_interface, [out, retval] Windows.UI.Xaml.DataTemplateKey **value);
+        HRESULT CreateInstanceWithType([in] IInspectable *data_type, [in] IInspectable *base_interface, [out] IInspectable **inner_interface, [out, retval] Windows.UI.Xaml.DataTemplateKey **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.DependencyObject),
+        uuid(5c526665-f60e-4912-af59-5fe0680f089d)
+    ]
+    interface IDependencyObject : IInspectable
+    {
+        HRESULT GetValue([in] Windows.UI.Xaml.DependencyProperty *dp, [out, retval] IInspectable **result);
+        HRESULT SetValue([in] Windows.UI.Xaml.DependencyProperty *dp, [in] IInspectable *value);
+        HRESULT ClearValue([in] Windows.UI.Xaml.DependencyProperty *dp);
+        HRESULT ReadLocalValue([in] Windows.UI.Xaml.DependencyProperty *dp, [out, retval] IInspectable **result);
+        HRESULT GetAnimationBaseValue([in] Windows.UI.Xaml.DependencyProperty *dp, [out, retval] IInspectable **result);
+        [propget] HRESULT Dispatcher([out, retval] Windows.UI.Core.CoreDispatcher **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.DependencyObject),
+        uuid(29fed85d-3d22-43a1-add0-17027c08b212)
+    ]
+    interface IDependencyObject2 : IInspectable
+    {
+        HRESULT RegisterPropertyChangedCallback([in] Windows.UI.Xaml.DependencyProperty *dp, [in] Windows.UI.Xaml.DependencyPropertyChangedCallback *callback, [out, retval] INT64 *result);
+        HRESULT UnregisterPropertyChangedCallback([in] Windows.UI.Xaml.DependencyProperty *dp, [in] INT64 token);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.DependencyObject),
+        uuid(9a03af92-7d8a-4937-884f-ecf34fe02acb)
+    ]
+    interface IDependencyObjectFactory : IInspectable
+    {
+        HRESULT CreateInstance([in] IInspectable *base_interface, [out] IInspectable **inner_interface, [out, retval] Windows.UI.Xaml.DependencyObject **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.DependencyProperty),
+        uuid(85b13970-9bc4-4e96-acf1-30c8fd3d55c8)
+    ]
+    interface IDependencyProperty : IInspectable
+    {
+        HRESULT GetMetadata([in] Windows.UI.Xaml.Interop.TypeName type, [out, retval] Windows.UI.Xaml.PropertyMetadata **result);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.DependencyPropertyChangedEventArgs),
+        uuid(81212c2b-24d0-4957-abc3-224470a93a4e)
+    ]
+    interface IDependencyPropertyChangedEventArgs : IInspectable
+    {
+        [propget] HRESULT Property([out, retval] Windows.UI.Xaml.DependencyProperty **value);
+        [propget] HRESULT OldValue([out, retval] IInspectable **value);
+        [propget] HRESULT NewValue([out, retval] IInspectable **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.DependencyProperty),
+        uuid(49e5f28f-8259-4d5c-aae0-83d56dbb68d9)
+    ]
+    interface IDependencyPropertyStatics : IInspectable
+    {
+        [propget] HRESULT UnsetValue([out, retval] IInspectable **value);
+        HRESULT Register([in] HSTRING name, [in] Windows.UI.Xaml.Interop.TypeName property_type, [in] Windows.UI.Xaml.Interop.TypeName owner_type, [in] Windows.UI.Xaml.PropertyMetadata *type_metadata, [out, retval] Windows.UI.Xaml.DependencyProperty **result);
+        HRESULT RegisterAttached([in] HSTRING name, [in] Windows.UI.Xaml.Interop.TypeName property_type, [in] Windows.UI.Xaml.Interop.TypeName owner_type, [in] Windows.UI.Xaml.PropertyMetadata *default_metadata, [out, retval] Windows.UI.Xaml.DependencyProperty **result);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.PropertyMetadata),
+        uuid(814ef30d-8d18-448a-8644-f2cb51e70380)
+    ]
+    interface IPropertyMetadata : IInspectable
+    {
+        [propget] HRESULT DefaultValue([out, retval] IInspectable **value);
+        [propget] HRESULT CreateDefaultValueCallback([out, retval] Windows.UI.Xaml.CreateDefaultValueCallback **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.PropertyMetadata),
+        uuid(c1b81cc0-57cd-4f2f-b0a9-e1801b28f76b)
+    ]
+    interface IPropertyMetadataFactory : IInspectable
+    {
+        HRESULT CreateInstanceWithDefaultValue([in] IInspectable *default_value, [in] IInspectable *base_interface, [out] IInspectable **inner_interface, [out, retval] Windows.UI.Xaml.PropertyMetadata **value);
+        HRESULT CreateInstanceWithDefaultValueAndCallback([in] IInspectable *default_value, [in] Windows.UI.Xaml.PropertyChangedCallback *property_changed_callback, [in] IInspectable* base_interface, [out] IInspectable **inner_interface, [out, retval] Windows.UI.Xaml.PropertyMetadata **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.Xaml.PropertyMetadata),
+        uuid(3b01077a-6e06-45e9-8b5c-af243458c062)
+    ]
+    interface IPropertyMetadataStatics : IInspectable
+    {
+        [default_overload] [overload("Create")] HRESULT CreateWithDefaultValue([in] IInspectable *default_value, [out, retval] Windows.UI.Xaml.PropertyMetadata **result);
+        [default_overload] [overload("Create")] HRESULT CreateWithDefaultValueAndCallback([in] IInspectable *default_value, [in] Windows.UI.Xaml.PropertyChangedCallback *property_changed_callback, [out, retval] Windows.UI.Xaml.PropertyMetadata **result);
+        [overload("Create")] HRESULT CreateWithFactory([in] Windows.UI.Xaml.CreateDefaultValueCallback *create_default_value_callback, [out, retval] Windows.UI.Xaml.PropertyMetadata **result);
+        [overload("Create")] HRESULT CreateWithFactoryAndCallback([in] Windows.UI.Xaml.CreateDefaultValueCallback *create_default_value_callback, [in] Windows.UI.Xaml.PropertyChangedCallback *property_changed_callback, [out, retval] Windows.UI.Xaml.PropertyMetadata **result);
+    }
+
+
+    [
+        composable(Windows.UI.Xaml.IDataTemplateKeyFactory, public, Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass DataTemplateKey
+    {
+        [default] interface Windows.UI.Xaml.IDataTemplateKey;
+    }
+
+    [
+        composable(Windows.UI.Xaml.IDependencyObjectFactory, protected, Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass DependencyObject
+    {
+        [default] interface Windows.UI.Xaml.IDependencyObject;
+        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.Xaml.IDependencyObject2;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        static(Windows.UI.Xaml.IDependencyPropertyStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        threading(both)
+    ]
+    runtimeclass DependencyProperty
+    {
+        [default] interface Windows.UI.Xaml.IDependencyProperty;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass DependencyPropertyChangedEventArgs
+    {
+        [default] interface Windows.UI.Xaml.IDependencyPropertyChangedEventArgs;
+    }
+
+    [
+        composable(Windows.UI.Xaml.IPropertyMetadataFactory, public, Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        static(Windows.UI.Xaml.IPropertyMetadataStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        threading(both)
+    ]
+    runtimeclass PropertyMetadata
+    {
+        [default] interface Windows.UI.Xaml.IPropertyMetadata;
+    }
+}
diff --git a/mingw-w64-headers/include/windows.ui.xaml.interop.h b/mingw-w64-headers/include/windows.ui.xaml.interop.h
new file mode 100644
index 0000000..86e5309
--- /dev/null
+++ b/mingw-w64-headers/include/windows.ui.xaml.interop.h
@@ -0,0 +1,130 @@
+/*** Autogenerated by WIDL 9.18 from include/windows.ui.xaml.interop.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_ui_xaml_interop_h__
+#define __windows_ui_xaml_interop_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 */
+
+/* Headers for imported files */
+
+#include <inspectable.h>
+#include <asyncinfo.h>
+#include <eventtoken.h>
+#include <windowscontracts.h>
+#include <windows.foundation.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __cplusplus
+typedef enum __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeKind __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeKind;
+#endif /* __cplusplus */
+
+#ifndef __cplusplus
+typedef struct __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName;
+#else /* __cplusplus */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                namespace Interop {
+                    typedef struct TypeName TypeName;
+                }
+            }
+        }
+    }
+}
+#endif /* __cplusplus */
+
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                namespace Interop {
+                    enum TypeKind {
+                        TypeKind_Primitive = 0,
+                        TypeKind_Metadata = 1,
+                        TypeKind_Custom = 2
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#else
+enum __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeKind {
+    TypeKind_Primitive = 0,
+    TypeKind_Metadata = 1,
+    TypeKind_Custom = 2
+};
+#ifdef WIDL_using_Windows_UI_Xaml_Interop
+#define TypeKind __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeKind
+#endif /* WIDL_using_Windows_UI_Xaml_Interop */
+#endif
+
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
+#ifdef __cplusplus
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace UI {
+            namespace Xaml {
+                namespace Interop {
+                    struct TypeName {
+                        HSTRING Name;
+                        ABI::Windows::UI::Xaml::Interop::TypeKind Kind;
+                    };
+                }
+            }
+        }
+    }
+}
+extern "C" {
+#else
+struct __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName {
+    HSTRING Name;
+    __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeKind Kind;
+};
+#ifdef WIDL_using_Windows_UI_Xaml_Interop
+#define TypeName __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName
+#endif /* WIDL_using_Windows_UI_Xaml_Interop */
+#endif
+
+#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __windows_ui_xaml_interop_h__ */
diff --git a/mingw-w64-headers/include/windows.ui.xaml.interop.idl b/mingw-w64-headers/include/windows.ui.xaml.interop.idl
new file mode 100644
index 0000000..ef786d5
--- /dev/null
+++ b/mingw-w64-headers/include/windows.ui.xaml.interop.idl
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2024 Zhiyi Zhang for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+import "inspectable.idl";
+import "asyncinfo.idl";
+import "eventtoken.idl";
+import "windowscontracts.idl";
+import "windows.foundation.idl";
+
+namespace Windows.UI.Xaml.Interop {
+    typedef enum TypeKind TypeKind;
+    typedef struct TypeName TypeName;
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum TypeKind
+    {
+        Primitive = 0,
+        Metadata  = 1,
+        Custom    = 2
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    struct TypeName
+    {
+        HSTRING Name;
+        Windows.UI.Xaml.Interop.TypeKind Kind;
+    };
+}
