/*** Autogenerated by WIDL 10.13 from include/windows.foundation.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_foundation_h__
#define __windows_foundation_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet ABI::Windows::Foundation::Collections::IPropertySet
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                interface IPropertySet;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CCollections_CPropertySet_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CCollections_CPropertySet_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                class PropertySet;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CFoundation_CCollections_CPropertySet __x_ABI_CWindows_CFoundation_CCollections_CPropertySet;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CFoundation_CCollections_CPropertySet_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CFoundation_CCollections_CValueSet_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CCollections_CValueSet_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                class ValueSet;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CFoundation_CCollections_CValueSet __x_ABI_CWindows_CFoundation_CCollections_CValueSet;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CFoundation_CCollections_CValueSet_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler ABI::Windows::Foundation::IAsyncActionCompletedHandler
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IAsyncActionCompletedHandler;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler ABI::Windows::Foundation::IDeferralCompletedHandler
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IDeferralCompletedHandler;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIStringable_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIStringable_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIStringable __x_ABI_CWindows_CFoundation_CIStringable;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIStringable ABI::Windows::Foundation::IStringable
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IStringable;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIClosable __x_ABI_CWindows_CFoundation_CIClosable;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIClosable ABI::Windows::Foundation::IClosable
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IClosable;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIDeferral_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIDeferral __x_ABI_CWindows_CFoundation_CIDeferral;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIDeferral ABI::Windows::Foundation::IDeferral
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IDeferral;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIDeferralFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIDeferralFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIDeferralFactory __x_ABI_CWindows_CFoundation_CIDeferralFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIDeferralFactory ABI::Windows::Foundation::IDeferralFactory
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IDeferralFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIGetActivationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIGetActivationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIGetActivationFactory __x_ABI_CWindows_CFoundation_CIGetActivationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIGetActivationFactory ABI::Windows::Foundation::IGetActivationFactory
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IGetActivationFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIAsyncAction __x_ABI_CWindows_CFoundation_CIAsyncAction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIAsyncAction ABI::Windows::Foundation::IAsyncAction
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IAsyncAction;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIMemoryBuffer_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIMemoryBuffer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIMemoryBuffer __x_ABI_CWindows_CFoundation_CIMemoryBuffer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIMemoryBuffer ABI::Windows::Foundation::IMemoryBuffer
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IMemoryBuffer;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory ABI::Windows::Foundation::IMemoryBufferFactory
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IMemoryBufferFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIMemoryBufferReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIMemoryBufferReference_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIMemoryBufferReference __x_ABI_CWindows_CFoundation_CIMemoryBufferReference;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference ABI::Windows::Foundation::IMemoryBufferReference
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IMemoryBufferReference;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIPropertyValue_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIPropertyValue_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIPropertyValue __x_ABI_CWindows_CFoundation_CIPropertyValue;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIPropertyValue ABI::Windows::Foundation::IPropertyValue
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IPropertyValue;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIPropertyValueStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIPropertyValueStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIPropertyValueStatics __x_ABI_CWindows_CFoundation_CIPropertyValueStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics ABI::Windows::Foundation::IPropertyValueStatics
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IPropertyValueStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIUriEscapeStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriEscapeStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIUriEscapeStatics __x_ABI_CWindows_CFoundation_CIUriEscapeStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIUriEscapeStatics ABI::Windows::Foundation::IUriEscapeStatics
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IUriEscapeStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIUriRuntimeClass_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriRuntimeClass_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIUriRuntimeClass __x_ABI_CWindows_CFoundation_CIUriRuntimeClass;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass ABI::Windows::Foundation::IUriRuntimeClass
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IUriRuntimeClass;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory ABI::Windows::Foundation::IUriRuntimeClassFactory
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IUriRuntimeClassFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri ABI::Windows::Foundation::IUriRuntimeClassWithAbsoluteCanonicalUri
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IUriRuntimeClassWithAbsoluteCanonicalUri;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry ABI::Windows::Foundation::IWwwFormUrlDecoderEntry
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IWwwFormUrlDecoderEntry;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass ABI::Windows::Foundation::IWwwFormUrlDecoderRuntimeClass
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IWwwFormUrlDecoderRuntimeClass;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory ABI::Windows::Foundation::IWwwFormUrlDecoderRuntimeClassFactory
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IWwwFormUrlDecoderRuntimeClassFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CDeferral_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Foundation {
            class Deferral;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CFoundation_CDeferral __x_ABI_CWindows_CFoundation_CDeferral;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CFoundation_CDeferral_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CFoundation_CMemoryBuffer_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CMemoryBuffer_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Foundation {
            class MemoryBuffer;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CFoundation_CMemoryBuffer __x_ABI_CWindows_CFoundation_CMemoryBuffer;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CFoundation_CMemoryBuffer_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CFoundation_CPropertyValue_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CPropertyValue_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Foundation {
            class PropertyValue;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CFoundation_CPropertyValue __x_ABI_CWindows_CFoundation_CPropertyValue;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CFoundation_CPropertyValue_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CFoundation_CUri_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CUri_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Foundation {
            class Uri;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CFoundation_CUri __x_ABI_CWindows_CFoundation_CUri;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CFoundation_CUri_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CFoundation_CWwwFormUrlDecoder_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CWwwFormUrlDecoder_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Foundation {
            class WwwFormUrlDecoder;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CFoundation_CWwwFormUrlDecoder __x_ABI_CWindows_CFoundation_CWwwFormUrlDecoder;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CFoundation_CWwwFormUrlDecoder_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CFoundation_CWwwFormUrlDecoderEntry_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CWwwFormUrlDecoderEntry_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Foundation {
            class WwwFormUrlDecoderEntry;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CFoundation_CWwwFormUrlDecoderEntry __x_ABI_CWindows_CFoundation_CWwwFormUrlDecoderEntry;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CFoundation_CWwwFormUrlDecoderEntry_FWD_DEFINED__ */

#ifndef ____FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
typedef interface __FIKeyValuePair_2_HSTRING_HSTRING __FIKeyValuePair_2_HSTRING_HSTRING;
#ifdef __cplusplus
#define __FIKeyValuePair_2_HSTRING_HSTRING ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIKeyValuePair_2_HSTRING_IInspectable __FIKeyValuePair_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIKeyValuePair_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
typedef interface __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING;
#ifdef __cplusplus
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
typedef interface __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING;
#ifdef __cplusplus
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapChangedEventArgs_1_HSTRING_FWD_DEFINED__
#define ____FIMapChangedEventArgs_1_HSTRING_FWD_DEFINED__
typedef interface __FIMapChangedEventArgs_1_HSTRING __FIMapChangedEventArgs_1_HSTRING;
#ifdef __cplusplus
#define __FIMapChangedEventArgs_1_HSTRING ABI::Windows::Foundation::Collections::IMapChangedEventArgs<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapChangedEventHandler_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIMapChangedEventHandler_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIMapChangedEventHandler_2_HSTRING_IInspectable __FIMapChangedEventHandler_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIMapChangedEventHandler_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IMapChangedEventHandler<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMap_2_HSTRING_HSTRING_FWD_DEFINED__
#define ____FIMap_2_HSTRING_HSTRING_FWD_DEFINED__
typedef interface __FIMap_2_HSTRING_HSTRING __FIMap_2_HSTRING_HSTRING;
#ifdef __cplusplus
#define __FIMap_2_HSTRING_HSTRING ABI::Windows::Foundation::Collections::IMap<HSTRING,HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIMap_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIMap_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIMap_2_HSTRING_IInspectable __FIMap_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIMap_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IMap<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING_HSTRING_FWD_DEFINED__
#define ____FIMapView_2_HSTRING_HSTRING_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING_HSTRING __FIMapView_2_HSTRING_HSTRING;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING_HSTRING ABI::Windows::Foundation::Collections::IMapView<HSTRING,HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIMapView_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING_IInspectable __FIMapView_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IMapView<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIObservableMap_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIObservableMap_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIObservableMap_2_HSTRING_IInspectable __FIObservableMap_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIObservableMap_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IObservableMap<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_HSTRING_FWD_DEFINED__
#define ____FIIterable_1_HSTRING_FWD_DEFINED__
typedef interface __FIIterable_1_HSTRING __FIIterable_1_HSTRING;
#ifdef __cplusplus
#define __FIIterable_1_HSTRING ABI::Windows::Foundation::Collections::IIterable<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_IInspectable_FWD_DEFINED__
#define ____FIIterable_1_IInspectable_FWD_DEFINED__
typedef interface __FIIterable_1_IInspectable __FIIterable_1_IInspectable;
#ifdef __cplusplus
#define __FIIterable_1_IInspectable ABI::Windows::Foundation::Collections::IIterable<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
#define ____FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIIterable_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CFoundation__CUri __FIIterable_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CFoundation__CUri ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_HSTRING_FWD_DEFINED__
#define ____FIIterator_1_HSTRING_FWD_DEFINED__
typedef interface __FIIterator_1_HSTRING __FIIterator_1_HSTRING;
#ifdef __cplusplus
#define __FIIterator_1_HSTRING ABI::Windows::Foundation::Collections::IIterator<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_IInspectable_FWD_DEFINED__
#define ____FIIterator_1_IInspectable_FWD_DEFINED__
typedef interface __FIIterator_1_IInspectable __FIIterator_1_IInspectable;
#ifdef __cplusplus
#define __FIIterator_1_IInspectable ABI::Windows::Foundation::Collections::IIterator<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
#define ____FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIIterator_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CFoundation__CUri __FIIterator_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CFoundation__CUri ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Uri* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_BYTE_FWD_DEFINED__
#define ____FIVectorView_1_BYTE_FWD_DEFINED__
typedef interface __FIVectorView_1_BYTE __FIVectorView_1_BYTE;
#ifdef __cplusplus
#define __FIVectorView_1_BYTE ABI::Windows::Foundation::Collections::IVectorView<BYTE >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_HSTRING_FWD_DEFINED__
#define ____FIVectorView_1_HSTRING_FWD_DEFINED__
typedef interface __FIVectorView_1_HSTRING __FIVectorView_1_HSTRING;
#ifdef __cplusplus
#define __FIVectorView_1_HSTRING ABI::Windows::Foundation::Collections::IVectorView<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_IInspectable_FWD_DEFINED__
#define ____FIVectorView_1_IInspectable_FWD_DEFINED__
typedef interface __FIVectorView_1_IInspectable __FIVectorView_1_IInspectable;
#ifdef __cplusplus
#define __FIVectorView_1_IInspectable ABI::Windows::Foundation::Collections::IVectorView<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CFoundation__CUri __FIVectorView_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CFoundation__CUri ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Foundation::Uri* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_HSTRING_FWD_DEFINED__
#define ____FIVector_1_HSTRING_FWD_DEFINED__
typedef interface __FIVector_1_HSTRING __FIVector_1_HSTRING;
#ifdef __cplusplus
#define __FIVector_1_HSTRING ABI::Windows::Foundation::Collections::IVector<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_IInspectable_FWD_DEFINED__
#define ____FIVector_1_IInspectable_FWD_DEFINED__
typedef interface __FIVector_1_IInspectable __FIVector_1_IInspectable;
#ifdef __cplusplus
#define __FIVector_1_IInspectable ABI::Windows::Foundation::Collections::IVector<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING___FIVectorView_1_HSTRING_FWD_DEFINED__
#define ____FIMapView_2_HSTRING___FIVectorView_1_HSTRING_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING___FIVectorView_1_HSTRING __FIMapView_2_HSTRING___FIVectorView_1_HSTRING;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Foundation::Collections::IVectorView<HSTRING >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIEventHandler_1_IInspectable_FWD_DEFINED__
#define ____FIEventHandler_1_IInspectable_FWD_DEFINED__
typedef interface __FIEventHandler_1_IInspectable __FIEventHandler_1_IInspectable;
#ifdef __cplusplus
#define __FIEventHandler_1_IInspectable ABI::Windows::Foundation::IEventHandler<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_HSTRING_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_HSTRING_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_HSTRING __FIAsyncOperationCompletedHandler_1_HSTRING;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_HSTRING ABI::Windows::Foundation::IAsyncOperationCompletedHandler<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_IInspectable_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_IInspectable_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_IInspectable __FIAsyncOperationCompletedHandler_1_IInspectable;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_IInspectable ABI::Windows::Foundation::IAsyncOperationCompletedHandler<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_boolean_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_boolean_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_boolean __FIAsyncOperationCompletedHandler_1_boolean;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_boolean ABI::Windows::Foundation::IAsyncOperationCompletedHandler<boolean >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_HSTRING_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_HSTRING_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_HSTRING __FIAsyncOperationCompletedHandler_1_HSTRING;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_HSTRING ABI::Windows::Foundation::IAsyncOperationCompletedHandler<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_UINT32_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_UINT32_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_UINT32 __FIAsyncOperationCompletedHandler_1_UINT32;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_UINT32 ABI::Windows::Foundation::IAsyncOperationCompletedHandler<UINT32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Uri* >
#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_HSTRING_FWD_DEFINED__
#define ____FIAsyncOperation_1_HSTRING_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_HSTRING __FIAsyncOperation_1_HSTRING;
#ifdef __cplusplus
#define __FIAsyncOperation_1_HSTRING ABI::Windows::Foundation::IAsyncOperation<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_IInspectable_FWD_DEFINED__
#define ____FIAsyncOperation_1_IInspectable_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_IInspectable __FIAsyncOperation_1_IInspectable;
#ifdef __cplusplus
#define __FIAsyncOperation_1_IInspectable ABI::Windows::Foundation::IAsyncOperation<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_boolean_FWD_DEFINED__
#define ____FIAsyncOperation_1_boolean_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_boolean __FIAsyncOperation_1_boolean;
#ifdef __cplusplus
#define __FIAsyncOperation_1_boolean ABI::Windows::Foundation::IAsyncOperation<boolean >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_UINT32_FWD_DEFINED__
#define ____FIAsyncOperation_1_UINT32_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_UINT32 __FIAsyncOperation_1_UINT32;
#ifdef __cplusplus
#define __FIAsyncOperation_1_UINT32 ABI::Windows::Foundation::IAsyncOperation<UINT32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CFoundation__CUri __FIAsyncOperation_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CFoundation__CUri ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Uri* >
#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;
#ifdef __cplusplus
#define __FIReference_1_BYTE ABI::Windows::Foundation::IReference<BYTE >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_DOUBLE_FWD_DEFINED__
#define ____FIReference_1_DOUBLE_FWD_DEFINED__
typedef interface __FIReference_1_DOUBLE __FIReference_1_DOUBLE;
#ifdef __cplusplus
#define __FIReference_1_DOUBLE ABI::Windows::Foundation::IReference<DOUBLE >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_FLOAT_FWD_DEFINED__
#define ____FIReference_1_FLOAT_FWD_DEFINED__
typedef interface __FIReference_1_FLOAT __FIReference_1_FLOAT;
#ifdef __cplusplus
#define __FIReference_1_FLOAT ABI::Windows::Foundation::IReference<FLOAT >
#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;
#ifdef __cplusplus
#define __FIReference_1_UINT32 ABI::Windows::Foundation::IReference<UINT32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_UINT64_FWD_DEFINED__
#define ____FIReference_1_UINT64_FWD_DEFINED__
typedef interface __FIReference_1_UINT64 __FIReference_1_UINT64;
#ifdef __cplusplus
#define __FIReference_1_UINT64 ABI::Windows::Foundation::IReference<UINT64 >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_DateTime_FWD_DEFINED__
#define ____FIReference_1_DateTime_FWD_DEFINED__
typedef interface __FIReference_1_DateTime __FIReference_1_DateTime;
#ifdef __cplusplus
#define __FIReference_1_DateTime ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime >
#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;
#ifdef __cplusplus
#define __FITypedEventHandler_2_IInspectable_IInspectable ABI::Windows::Foundation::ITypedEventHandler<IInspectable*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Foundation::IMemoryBufferReference*,IInspectable* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <windowscontracts.h>
#include <eventtoken.h>
#include <windows.foundation.collections.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet ABI::Windows::Foundation::Collections::IPropertySet
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                interface IPropertySet;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
typedef interface __FIKeyValuePair_2_HSTRING_HSTRING __FIKeyValuePair_2_HSTRING_HSTRING;
#ifdef __cplusplus
#define __FIKeyValuePair_2_HSTRING_HSTRING ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIKeyValuePair_2_HSTRING_IInspectable __FIKeyValuePair_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIKeyValuePair_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
typedef interface __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING;
#ifdef __cplusplus
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_FWD_DEFINED__
typedef interface __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING;
#ifdef __cplusplus
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapChangedEventArgs_1_HSTRING_FWD_DEFINED__
#define ____FIMapChangedEventArgs_1_HSTRING_FWD_DEFINED__
typedef interface __FIMapChangedEventArgs_1_HSTRING __FIMapChangedEventArgs_1_HSTRING;
#ifdef __cplusplus
#define __FIMapChangedEventArgs_1_HSTRING ABI::Windows::Foundation::Collections::IMapChangedEventArgs<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIMap_2_HSTRING_HSTRING_FWD_DEFINED__
#define ____FIMap_2_HSTRING_HSTRING_FWD_DEFINED__
typedef interface __FIMap_2_HSTRING_HSTRING __FIMap_2_HSTRING_HSTRING;
#ifdef __cplusplus
#define __FIMap_2_HSTRING_HSTRING ABI::Windows::Foundation::Collections::IMap<HSTRING,HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIMap_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIMap_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIMap_2_HSTRING_IInspectable __FIMap_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIMap_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IMap<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING_HSTRING_FWD_DEFINED__
#define ____FIMapView_2_HSTRING_HSTRING_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING_HSTRING __FIMapView_2_HSTRING_HSTRING;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING_HSTRING ABI::Windows::Foundation::Collections::IMapView<HSTRING,HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIMapView_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING_IInspectable __FIMapView_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IMapView<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIObservableMap_2_HSTRING_IInspectable_FWD_DEFINED__
#define ____FIObservableMap_2_HSTRING_IInspectable_FWD_DEFINED__
typedef interface __FIObservableMap_2_HSTRING_IInspectable __FIObservableMap_2_HSTRING_IInspectable;
#ifdef __cplusplus
#define __FIObservableMap_2_HSTRING_IInspectable ABI::Windows::Foundation::Collections::IObservableMap<HSTRING,IInspectable* >
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IPropertySet interface
 */
#if !defined(WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION)
#define WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION 0x40000
#endif // defined(WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION)

#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CCollections_CIPropertySet, 0x8a43ed9f, 0xf4e6, 0x4421, 0xac,0xf9, 0x1d,0xab,0x29,0x86,0x82,0x0c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                MIDL_INTERFACE("8a43ed9f-f4e6-4421-acf9-1dab2986820c")
                IPropertySet : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet, 0x8a43ed9f, 0xf4e6, 0x4421, 0xac,0xf9, 0x1d,0xab,0x29,0x86,0x82,0x0c)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CCollections_CIPropertySetVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CCollections_CIPropertySetVtbl;

interface __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CCollections_CIPropertySetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_QueryInterface(__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_AddRef(__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_Release(__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_GetIids(__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_GetTrustLevel(__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IPropertySet IID___x_ABI_CWindows_CFoundation_CCollections_CIPropertySet
#define IPropertySetVtbl __x_ABI_CWindows_CFoundation_CCollections_CIPropertySetVtbl
#define IPropertySet __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet
#define IPropertySet_QueryInterface __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_QueryInterface
#define IPropertySet_AddRef __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_AddRef
#define IPropertySet_Release __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_Release
#define IPropertySet_GetIids __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_GetIids
#define IPropertySet_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_GetRuntimeClassName
#define IPropertySet_GetTrustLevel __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_GetTrustLevel
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CFoundation_CCollections_CIPropertySet_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Foundation.Collections.PropertySet
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Foundation_Collections_PropertySet_DEFINED
#define RUNTIMECLASS_Windows_Foundation_Collections_PropertySet_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Foundation_Collections_PropertySet[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','C','o','l','l','e','c','t','i','o','n','s','.','P','r','o','p','e','r','t','y','S','e','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_Collections_PropertySet[] = L"Windows.Foundation.Collections.PropertySet";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_Collections_PropertySet[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','C','o','l','l','e','c','t','i','o','n','s','.','P','r','o','p','e','r','t','y','S','e','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Foundation_Collections_PropertySet_DEFINED */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Foundation.Collections.ValueSet
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Foundation_Collections_ValueSet_DEFINED
#define RUNTIMECLASS_Windows_Foundation_Collections_ValueSet_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Foundation_Collections_ValueSet[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','C','o','l','l','e','c','t','i','o','n','s','.','V','a','l','u','e','S','e','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_Collections_ValueSet[] = L"Windows.Foundation.Collections.ValueSet";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_Collections_ValueSet[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','C','o','l','l','e','c','t','i','o','n','s','.','V','a','l','u','e','S','e','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Foundation_Collections_ValueSet_DEFINED */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CPropertyType_ENUM_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CPropertyType_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            enum PropertyType {
                PropertyType_Empty = 0,
                PropertyType_UInt8 = 1,
                PropertyType_Int16 = 2,
                PropertyType_UInt16 = 3,
                PropertyType_Int32 = 4,
                PropertyType_UInt32 = 5,
                PropertyType_Int64 = 6,
                PropertyType_UInt64 = 7,
                PropertyType_Single = 8,
                PropertyType_Double = 9,
                PropertyType_Char16 = 10,
                PropertyType_Boolean = 11,
                PropertyType_String = 12,
                PropertyType_Inspectable = 13,
                PropertyType_DateTime = 14,
                PropertyType_TimeSpan = 15,
                PropertyType_Guid = 16,
                PropertyType_Point = 17,
                PropertyType_Size = 18,
                PropertyType_Rect = 19,
                PropertyType_OtherType = 20,
                PropertyType_UInt8Array = 1025,
                PropertyType_Int16Array = 1026,
                PropertyType_UInt16Array = 1027,
                PropertyType_Int32Array = 1028,
                PropertyType_UInt32Array = 1029,
                PropertyType_Int64Array = 1030,
                PropertyType_UInt64Array = 1031,
                PropertyType_SingleArray = 1032,
                PropertyType_DoubleArray = 1033,
                PropertyType_Char16Array = 1034,
                PropertyType_BooleanArray = 1035,
                PropertyType_StringArray = 1036,
                PropertyType_InspectableArray = 1037,
                PropertyType_DateTimeArray = 1038,
                PropertyType_TimeSpanArray = 1039,
                PropertyType_GuidArray = 1040,
                PropertyType_PointArray = 1041,
                PropertyType_SizeArray = 1042,
                PropertyType_RectArray = 1043,
                PropertyType_OtherTypeArray = 1044
            };
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CFoundation_CPropertyType {
    PropertyType_Empty = 0,
    PropertyType_UInt8 = 1,
    PropertyType_Int16 = 2,
    PropertyType_UInt16 = 3,
    PropertyType_Int32 = 4,
    PropertyType_UInt32 = 5,
    PropertyType_Int64 = 6,
    PropertyType_UInt64 = 7,
    PropertyType_Single = 8,
    PropertyType_Double = 9,
    PropertyType_Char16 = 10,
    PropertyType_Boolean = 11,
    PropertyType_String = 12,
    PropertyType_Inspectable = 13,
    PropertyType_DateTime = 14,
    PropertyType_TimeSpan = 15,
    PropertyType_Guid = 16,
    PropertyType_Point = 17,
    PropertyType_Size = 18,
    PropertyType_Rect = 19,
    PropertyType_OtherType = 20,
    PropertyType_UInt8Array = 1025,
    PropertyType_Int16Array = 1026,
    PropertyType_UInt16Array = 1027,
    PropertyType_Int32Array = 1028,
    PropertyType_UInt32Array = 1029,
    PropertyType_Int64Array = 1030,
    PropertyType_UInt64Array = 1031,
    PropertyType_SingleArray = 1032,
    PropertyType_DoubleArray = 1033,
    PropertyType_Char16Array = 1034,
    PropertyType_BooleanArray = 1035,
    PropertyType_StringArray = 1036,
    PropertyType_InspectableArray = 1037,
    PropertyType_DateTimeArray = 1038,
    PropertyType_TimeSpanArray = 1039,
    PropertyType_GuidArray = 1040,
    PropertyType_PointArray = 1041,
    PropertyType_SizeArray = 1042,
    PropertyType_RectArray = 1043,
    PropertyType_OtherTypeArray = 1044
};
#ifdef WIDL_using_Windows_Foundation
#define PropertyType __x_ABI_CWindows_CFoundation_CPropertyType
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif /* ____x_ABI_CWindows_CFoundation_CPropertyType_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CFoundation_CPropertyType __x_ABI_CWindows_CFoundation_CPropertyType;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CFoundation_CPoint __x_ABI_CWindows_CFoundation_CPoint;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            typedef struct Point Point;
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CFoundation_CSize __x_ABI_CWindows_CFoundation_CSize;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            typedef struct Size Size;
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CFoundation_CRect __x_ABI_CWindows_CFoundation_CRect;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            typedef struct Rect Rect;
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CFoundation_CDateTime __x_ABI_CWindows_CFoundation_CDateTime;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            typedef struct DateTime DateTime;
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CFoundation_CTimeSpan __x_ABI_CWindows_CFoundation_CTimeSpan;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            typedef struct TimeSpan TimeSpan;
        }
    }
}
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIAsyncAction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIAsyncAction __x_ABI_CWindows_CFoundation_CIAsyncAction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIAsyncAction ABI::Windows::Foundation::IAsyncAction
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IAsyncAction;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIClosable __x_ABI_CWindows_CFoundation_CIClosable;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIClosable ABI::Windows::Foundation::IClosable
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IClosable;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIDeferral_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIDeferral_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIDeferral __x_ABI_CWindows_CFoundation_CIDeferral;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIDeferral ABI::Windows::Foundation::IDeferral
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IDeferral;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIDeferralFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIDeferralFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIDeferralFactory __x_ABI_CWindows_CFoundation_CIDeferralFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIDeferralFactory ABI::Windows::Foundation::IDeferralFactory
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IDeferralFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIGetActivationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIGetActivationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIGetActivationFactory __x_ABI_CWindows_CFoundation_CIGetActivationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIGetActivationFactory ABI::Windows::Foundation::IGetActivationFactory
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IGetActivationFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIMemoryBuffer_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIMemoryBuffer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIMemoryBuffer __x_ABI_CWindows_CFoundation_CIMemoryBuffer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIMemoryBuffer ABI::Windows::Foundation::IMemoryBuffer
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IMemoryBuffer;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory ABI::Windows::Foundation::IMemoryBufferFactory
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IMemoryBufferFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIMemoryBufferReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIMemoryBufferReference_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIMemoryBufferReference __x_ABI_CWindows_CFoundation_CIMemoryBufferReference;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference ABI::Windows::Foundation::IMemoryBufferReference
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IMemoryBufferReference;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIPropertyValue_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIPropertyValue_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIPropertyValue __x_ABI_CWindows_CFoundation_CIPropertyValue;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIPropertyValue ABI::Windows::Foundation::IPropertyValue
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IPropertyValue;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIPropertyValueStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIPropertyValueStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIPropertyValueStatics __x_ABI_CWindows_CFoundation_CIPropertyValueStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics ABI::Windows::Foundation::IPropertyValueStatics
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IPropertyValueStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIStringable_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIStringable_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIStringable __x_ABI_CWindows_CFoundation_CIStringable;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIStringable ABI::Windows::Foundation::IStringable
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IStringable;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIUriEscapeStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriEscapeStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIUriEscapeStatics __x_ABI_CWindows_CFoundation_CIUriEscapeStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIUriEscapeStatics ABI::Windows::Foundation::IUriEscapeStatics
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IUriEscapeStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIUriRuntimeClass_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriRuntimeClass_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIUriRuntimeClass __x_ABI_CWindows_CFoundation_CIUriRuntimeClass;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass ABI::Windows::Foundation::IUriRuntimeClass
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IUriRuntimeClass;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory ABI::Windows::Foundation::IUriRuntimeClassFactory
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IUriRuntimeClassFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri ABI::Windows::Foundation::IUriRuntimeClassWithAbsoluteCanonicalUri
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IUriRuntimeClassWithAbsoluteCanonicalUri;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry ABI::Windows::Foundation::IWwwFormUrlDecoderEntry
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IWwwFormUrlDecoderEntry;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass ABI::Windows::Foundation::IWwwFormUrlDecoderRuntimeClass
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IWwwFormUrlDecoderRuntimeClass;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory ABI::Windows::Foundation::IWwwFormUrlDecoderRuntimeClassFactory
namespace ABI {
    namespace Windows {
        namespace Foundation {
            interface IWwwFormUrlDecoderRuntimeClassFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_HSTRING_FWD_DEFINED__
#define ____FIIterable_1_HSTRING_FWD_DEFINED__
typedef interface __FIIterable_1_HSTRING __FIIterable_1_HSTRING;
#ifdef __cplusplus
#define __FIIterable_1_HSTRING ABI::Windows::Foundation::Collections::IIterable<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_IInspectable_FWD_DEFINED__
#define ____FIIterable_1_IInspectable_FWD_DEFINED__
typedef interface __FIIterable_1_IInspectable __FIIterable_1_IInspectable;
#ifdef __cplusplus
#define __FIIterable_1_IInspectable ABI::Windows::Foundation::Collections::IIterable<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
#define ____FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIIterable_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CFoundation__CUri __FIIterable_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CFoundation__CUri ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_HSTRING_FWD_DEFINED__
#define ____FIIterator_1_HSTRING_FWD_DEFINED__
typedef interface __FIIterator_1_HSTRING __FIIterator_1_HSTRING;
#ifdef __cplusplus
#define __FIIterator_1_HSTRING ABI::Windows::Foundation::Collections::IIterator<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_IInspectable_FWD_DEFINED__
#define ____FIIterator_1_IInspectable_FWD_DEFINED__
typedef interface __FIIterator_1_IInspectable __FIIterator_1_IInspectable;
#ifdef __cplusplus
#define __FIIterator_1_IInspectable ABI::Windows::Foundation::Collections::IIterator<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
#define ____FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIIterator_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CFoundation__CUri __FIIterator_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CFoundation__CUri ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Uri* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_BYTE_FWD_DEFINED__
#define ____FIVectorView_1_BYTE_FWD_DEFINED__
typedef interface __FIVectorView_1_BYTE __FIVectorView_1_BYTE;
#ifdef __cplusplus
#define __FIVectorView_1_BYTE ABI::Windows::Foundation::Collections::IVectorView<BYTE >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_HSTRING_FWD_DEFINED__
#define ____FIVectorView_1_HSTRING_FWD_DEFINED__
typedef interface __FIVectorView_1_HSTRING __FIVectorView_1_HSTRING;
#ifdef __cplusplus
#define __FIVectorView_1_HSTRING ABI::Windows::Foundation::Collections::IVectorView<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_IInspectable_FWD_DEFINED__
#define ____FIVectorView_1_IInspectable_FWD_DEFINED__
typedef interface __FIVectorView_1_IInspectable __FIVectorView_1_IInspectable;
#ifdef __cplusplus
#define __FIVectorView_1_IInspectable ABI::Windows::Foundation::Collections::IVectorView<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CFoundation__CUri __FIVectorView_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CFoundation__CUri ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Foundation::Uri* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_HSTRING_FWD_DEFINED__
#define ____FIVector_1_HSTRING_FWD_DEFINED__
typedef interface __FIVector_1_HSTRING __FIVector_1_HSTRING;
#ifdef __cplusplus
#define __FIVector_1_HSTRING ABI::Windows::Foundation::Collections::IVector<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_IInspectable_FWD_DEFINED__
#define ____FIVector_1_IInspectable_FWD_DEFINED__
typedef interface __FIVector_1_IInspectable __FIVector_1_IInspectable;
#ifdef __cplusplus
#define __FIVector_1_IInspectable ABI::Windows::Foundation::Collections::IVector<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING___FIVectorView_1_HSTRING_FWD_DEFINED__
#define ____FIMapView_2_HSTRING___FIVectorView_1_HSTRING_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING___FIVectorView_1_HSTRING __FIMapView_2_HSTRING___FIVectorView_1_HSTRING;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Foundation::Collections::IVectorView<HSTRING >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_HSTRING_FWD_DEFINED__
#define ____FIAsyncOperation_1_HSTRING_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_HSTRING __FIAsyncOperation_1_HSTRING;
#ifdef __cplusplus
#define __FIAsyncOperation_1_HSTRING ABI::Windows::Foundation::IAsyncOperation<HSTRING >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_IInspectable_FWD_DEFINED__
#define ____FIAsyncOperation_1_IInspectable_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_IInspectable __FIAsyncOperation_1_IInspectable;
#ifdef __cplusplus
#define __FIAsyncOperation_1_IInspectable ABI::Windows::Foundation::IAsyncOperation<IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_boolean_FWD_DEFINED__
#define ____FIAsyncOperation_1_boolean_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_boolean __FIAsyncOperation_1_boolean;
#ifdef __cplusplus
#define __FIAsyncOperation_1_boolean ABI::Windows::Foundation::IAsyncOperation<boolean >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_UINT32_FWD_DEFINED__
#define ____FIAsyncOperation_1_UINT32_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_UINT32 __FIAsyncOperation_1_UINT32;
#ifdef __cplusplus
#define __FIAsyncOperation_1_UINT32 ABI::Windows::Foundation::IAsyncOperation<UINT32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CFoundation__CUri_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CFoundation__CUri_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CFoundation__CUri __FIAsyncOperation_1_Windows__CFoundation__CUri;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CFoundation__CUri ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Uri* >
#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;
#ifdef __cplusplus
#define __FIReference_1_BYTE ABI::Windows::Foundation::IReference<BYTE >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_DOUBLE_FWD_DEFINED__
#define ____FIReference_1_DOUBLE_FWD_DEFINED__
typedef interface __FIReference_1_DOUBLE __FIReference_1_DOUBLE;
#ifdef __cplusplus
#define __FIReference_1_DOUBLE ABI::Windows::Foundation::IReference<DOUBLE >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_FLOAT_FWD_DEFINED__
#define ____FIReference_1_FLOAT_FWD_DEFINED__
typedef interface __FIReference_1_FLOAT __FIReference_1_FLOAT;
#ifdef __cplusplus
#define __FIReference_1_FLOAT ABI::Windows::Foundation::IReference<FLOAT >
#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;
#ifdef __cplusplus
#define __FIReference_1_UINT32 ABI::Windows::Foundation::IReference<UINT32 >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_UINT64_FWD_DEFINED__
#define ____FIReference_1_UINT64_FWD_DEFINED__
typedef interface __FIReference_1_UINT64 __FIReference_1_UINT64;
#ifdef __cplusplus
#define __FIReference_1_UINT64 ABI::Windows::Foundation::IReference<UINT64 >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_DateTime_FWD_DEFINED__
#define ____FIReference_1_DateTime_FWD_DEFINED__
typedef interface __FIReference_1_DateTime __FIReference_1_DateTime;
#ifdef __cplusplus
#define __FIReference_1_DateTime ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime >
#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
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("a4ed5c81-76c9-40bd-8be6-b1d90fb20ae7")
            IAsyncActionCompletedHandler : public IUnknown
            {
                virtual HRESULT STDMETHODCALLTYPE Invoke(
                    ABI::Windows::Foundation::IAsyncAction *action,
                    AsyncStatus status) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler, 0xa4ed5c81, 0x76c9, 0x40bd, 0x8b,0xe6, 0xb1,0xd9,0x0f,0xb2,0x0a,0xe7)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncActionCompletedHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction *action,
        AsyncStatus status);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandlerVtbl;

interface __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncActionCompletedHandler methods ***/
#define __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_Invoke(This,action,status) (This)->lpVtbl->Invoke(This,action,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_QueryInterface(__x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_AddRef(__x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_Release(__x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncActionCompletedHandler methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_Invoke(__x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler* This,__x_ABI_CWindows_CFoundation_CIAsyncAction *action,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,action,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncActionCompletedHandler IID___x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler
#define IAsyncActionCompletedHandlerVtbl __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandlerVtbl
#define IAsyncActionCompletedHandler __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler
#define IAsyncActionCompletedHandler_QueryInterface __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_QueryInterface
#define IAsyncActionCompletedHandler_AddRef __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_AddRef
#define IAsyncActionCompletedHandler_Release __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_Release
#define IAsyncActionCompletedHandler_Invoke __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDeferralCompletedHandler interface
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler, 0xed32a372, 0xf3c8, 0x4faa, 0x9c,0xfb, 0x47,0x01,0x48,0xda,0x38,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("ed32a372-f3c8-4faa-9cfb-470148da3888")
            IDeferralCompletedHandler : public IUnknown
            {
                virtual HRESULT STDMETHODCALLTYPE Invoke(
                    ) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler, 0xed32a372, 0xf3c8, 0x4faa, 0x9c,0xfb, 0x47,0x01,0x48,0xda,0x38,0x88)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDeferralCompletedHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler *This);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandlerVtbl;

interface __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDeferralCompletedHandler methods ***/
#define __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_Invoke(This) (This)->lpVtbl->Invoke(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_QueryInterface(__x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_AddRef(__x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_Release(__x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDeferralCompletedHandler methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_Invoke(__x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler* This) {
    return This->lpVtbl->Invoke(This);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IDeferralCompletedHandler IID___x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler
#define IDeferralCompletedHandlerVtbl __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandlerVtbl
#define IDeferralCompletedHandler __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler
#define IDeferralCompletedHandler_QueryInterface __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_QueryInterface
#define IDeferralCompletedHandler_AddRef __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_AddRef
#define IDeferralCompletedHandler_Release __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_Release
#define IDeferralCompletedHandler_Invoke __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            struct Point {
                FLOAT X;
                FLOAT Y;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CFoundation_CPoint {
    FLOAT X;
    FLOAT Y;
};
#ifdef WIDL_using_Windows_Foundation
#define Point __x_ABI_CWindows_CFoundation_CPoint
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            struct Size {
                FLOAT Width;
                FLOAT Height;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CFoundation_CSize {
    FLOAT Width;
    FLOAT Height;
};
#ifdef WIDL_using_Windows_Foundation
#define Size __x_ABI_CWindows_CFoundation_CSize
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            struct Rect {
                FLOAT X;
                FLOAT Y;
                FLOAT Width;
                FLOAT Height;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CFoundation_CRect {
    FLOAT X;
    FLOAT Y;
    FLOAT Width;
    FLOAT Height;
};
#ifdef WIDL_using_Windows_Foundation
#define Rect __x_ABI_CWindows_CFoundation_CRect
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            struct DateTime {
                INT64 UniversalTime;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CFoundation_CDateTime {
    INT64 UniversalTime;
};
#ifdef WIDL_using_Windows_Foundation
#define DateTime __x_ABI_CWindows_CFoundation_CDateTime
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            struct TimeSpan {
                INT64 Duration;
            };
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CFoundation_CTimeSpan {
    INT64 Duration;
};
#ifdef WIDL_using_Windows_Foundation
#define TimeSpan __x_ABI_CWindows_CFoundation_CTimeSpan
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IStringable interface
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIStringable, 0x96369f54, 0x8eb6, 0x48f0, 0xab,0xce, 0xc1,0xb2,0x11,0xe6,0x27,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("96369f54-8eb6-48f0-abce-c1b211e627c3")
            IStringable : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE ToString(
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIStringable, 0x96369f54, 0x8eb6, 0x48f0, 0xab,0xce, 0xc1,0xb2,0x11,0xe6,0x27,0xc3)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIStringableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IStringable methods ***/
    HRESULT (STDMETHODCALLTYPE *ToString)(
        __x_ABI_CWindows_CFoundation_CIStringable *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIStringableVtbl;

interface __x_ABI_CWindows_CFoundation_CIStringable {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIStringableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIStringable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIStringable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIStringable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIStringable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIStringable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIStringable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IStringable methods ***/
#define __x_ABI_CWindows_CFoundation_CIStringable_ToString(This,value) (This)->lpVtbl->ToString(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIStringable_QueryInterface(__x_ABI_CWindows_CFoundation_CIStringable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIStringable_AddRef(__x_ABI_CWindows_CFoundation_CIStringable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIStringable_Release(__x_ABI_CWindows_CFoundation_CIStringable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetIids(__x_ABI_CWindows_CFoundation_CIStringable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIStringable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIStringable_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIStringable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IStringable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIStringable_ToString(__x_ABI_CWindows_CFoundation_CIStringable* This,HSTRING *value) {
    return This->lpVtbl->ToString(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IStringable IID___x_ABI_CWindows_CFoundation_CIStringable
#define IStringableVtbl __x_ABI_CWindows_CFoundation_CIStringableVtbl
#define IStringable __x_ABI_CWindows_CFoundation_CIStringable
#define IStringable_QueryInterface __x_ABI_CWindows_CFoundation_CIStringable_QueryInterface
#define IStringable_AddRef __x_ABI_CWindows_CFoundation_CIStringable_AddRef
#define IStringable_Release __x_ABI_CWindows_CFoundation_CIStringable_Release
#define IStringable_GetIids __x_ABI_CWindows_CFoundation_CIStringable_GetIids
#define IStringable_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIStringable_GetRuntimeClassName
#define IStringable_GetTrustLevel __x_ABI_CWindows_CFoundation_CIStringable_GetTrustLevel
#define IStringable_ToString __x_ABI_CWindows_CFoundation_CIStringable_ToString
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CFoundation_CIStringable_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IClosable interface
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIClosable_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIClosable_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIClosable, 0x30d5a829, 0x7fa4, 0x4026, 0x83,0xbb, 0xd7,0x5b,0xae,0x4e,0xa9,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("30d5a829-7fa4-4026-83bb-d75bae4ea99e")
            IClosable : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE Close(
                    ) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIClosable, 0x30d5a829, 0x7fa4, 0x4026, 0x83,0xbb, 0xd7,0x5b,0xae,0x4e,0xa9,0x9e)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIClosableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IClosable methods ***/
    HRESULT (STDMETHODCALLTYPE *Close)(
        __x_ABI_CWindows_CFoundation_CIClosable *This);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIClosableVtbl;

interface __x_ABI_CWindows_CFoundation_CIClosable {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIClosableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIClosable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIClosable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIClosable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIClosable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIClosable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIClosable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IClosable methods ***/
#define __x_ABI_CWindows_CFoundation_CIClosable_Close(This) (This)->lpVtbl->Close(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIClosable_QueryInterface(__x_ABI_CWindows_CFoundation_CIClosable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIClosable_AddRef(__x_ABI_CWindows_CFoundation_CIClosable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIClosable_Release(__x_ABI_CWindows_CFoundation_CIClosable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIClosable_GetIids(__x_ABI_CWindows_CFoundation_CIClosable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIClosable_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIClosable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIClosable_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIClosable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IClosable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIClosable_Close(__x_ABI_CWindows_CFoundation_CIClosable* This) {
    return This->lpVtbl->Close(This);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IClosable IID___x_ABI_CWindows_CFoundation_CIClosable
#define IClosableVtbl __x_ABI_CWindows_CFoundation_CIClosableVtbl
#define IClosable __x_ABI_CWindows_CFoundation_CIClosable
#define IClosable_QueryInterface __x_ABI_CWindows_CFoundation_CIClosable_QueryInterface
#define IClosable_AddRef __x_ABI_CWindows_CFoundation_CIClosable_AddRef
#define IClosable_Release __x_ABI_CWindows_CFoundation_CIClosable_Release
#define IClosable_GetIids __x_ABI_CWindows_CFoundation_CIClosable_GetIids
#define IClosable_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIClosable_GetRuntimeClassName
#define IClosable_GetTrustLevel __x_ABI_CWindows_CFoundation_CIClosable_GetTrustLevel
#define IClosable_Close __x_ABI_CWindows_CFoundation_CIClosable_Close
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CFoundation_CIClosable_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDeferral interface
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIDeferral_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIDeferral_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIDeferral, 0xd6269732, 0x3b7f, 0x46a7, 0xb4,0x0b, 0x4f,0xdc,0xa2,0xa2,0xc6,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("d6269732-3b7f-46a7-b40b-4fdca2a2c693")
            IDeferral : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE Complete(
                    ) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIDeferral, 0xd6269732, 0x3b7f, 0x46a7, 0xb4,0x0b, 0x4f,0xdc,0xa2,0xa2,0xc6,0x93)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIDeferralVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDeferral methods ***/
    HRESULT (STDMETHODCALLTYPE *Complete)(
        __x_ABI_CWindows_CFoundation_CIDeferral *This);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIDeferralVtbl;

interface __x_ABI_CWindows_CFoundation_CIDeferral {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIDeferralVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIDeferral_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIDeferral_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIDeferral_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIDeferral_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIDeferral_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIDeferral_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDeferral methods ***/
#define __x_ABI_CWindows_CFoundation_CIDeferral_Complete(This) (This)->lpVtbl->Complete(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferral_QueryInterface(__x_ABI_CWindows_CFoundation_CIDeferral* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIDeferral_AddRef(__x_ABI_CWindows_CFoundation_CIDeferral* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIDeferral_Release(__x_ABI_CWindows_CFoundation_CIDeferral* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferral_GetIids(__x_ABI_CWindows_CFoundation_CIDeferral* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferral_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIDeferral* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferral_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIDeferral* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDeferral methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferral_Complete(__x_ABI_CWindows_CFoundation_CIDeferral* This) {
    return This->lpVtbl->Complete(This);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IDeferral IID___x_ABI_CWindows_CFoundation_CIDeferral
#define IDeferralVtbl __x_ABI_CWindows_CFoundation_CIDeferralVtbl
#define IDeferral __x_ABI_CWindows_CFoundation_CIDeferral
#define IDeferral_QueryInterface __x_ABI_CWindows_CFoundation_CIDeferral_QueryInterface
#define IDeferral_AddRef __x_ABI_CWindows_CFoundation_CIDeferral_AddRef
#define IDeferral_Release __x_ABI_CWindows_CFoundation_CIDeferral_Release
#define IDeferral_GetIids __x_ABI_CWindows_CFoundation_CIDeferral_GetIids
#define IDeferral_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIDeferral_GetRuntimeClassName
#define IDeferral_GetTrustLevel __x_ABI_CWindows_CFoundation_CIDeferral_GetTrustLevel
#define IDeferral_Complete __x_ABI_CWindows_CFoundation_CIDeferral_Complete
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CFoundation_CIDeferral_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDeferralFactory interface
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIDeferralFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIDeferralFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIDeferralFactory, 0x65a1ecc5, 0x3fb5, 0x4832, 0x8c,0xa9, 0xf0,0x61,0xb2,0x81,0xd1,0x3a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("65a1ecc5-3fb5-4832-8ca9-f061b281d13a")
            IDeferralFactory : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE Create(
                    ABI::Windows::Foundation::IDeferralCompletedHandler *handler,
                    ABI::Windows::Foundation::IDeferral **result) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIDeferralFactory, 0x65a1ecc5, 0x3fb5, 0x4832, 0x8c,0xa9, 0xf0,0x61,0xb2,0x81,0xd1,0x3a)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIDeferralFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IDeferralFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        __x_ABI_CWindows_CFoundation_CIDeferralFactory *This,
        __x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler *handler,
        __x_ABI_CWindows_CFoundation_CIDeferral **result);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIDeferralFactoryVtbl;

interface __x_ABI_CWindows_CFoundation_CIDeferralFactory {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIDeferralFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIDeferralFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIDeferralFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIDeferralFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIDeferralFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIDeferralFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIDeferralFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDeferralFactory methods ***/
#define __x_ABI_CWindows_CFoundation_CIDeferralFactory_Create(This,handler,result) (This)->lpVtbl->Create(This,handler,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferralFactory_QueryInterface(__x_ABI_CWindows_CFoundation_CIDeferralFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIDeferralFactory_AddRef(__x_ABI_CWindows_CFoundation_CIDeferralFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIDeferralFactory_Release(__x_ABI_CWindows_CFoundation_CIDeferralFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferralFactory_GetIids(__x_ABI_CWindows_CFoundation_CIDeferralFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferralFactory_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIDeferralFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferralFactory_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIDeferralFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDeferralFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIDeferralFactory_Create(__x_ABI_CWindows_CFoundation_CIDeferralFactory* This,__x_ABI_CWindows_CFoundation_CIDeferralCompletedHandler *handler,__x_ABI_CWindows_CFoundation_CIDeferral **result) {
    return This->lpVtbl->Create(This,handler,result);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IDeferralFactory IID___x_ABI_CWindows_CFoundation_CIDeferralFactory
#define IDeferralFactoryVtbl __x_ABI_CWindows_CFoundation_CIDeferralFactoryVtbl
#define IDeferralFactory __x_ABI_CWindows_CFoundation_CIDeferralFactory
#define IDeferralFactory_QueryInterface __x_ABI_CWindows_CFoundation_CIDeferralFactory_QueryInterface
#define IDeferralFactory_AddRef __x_ABI_CWindows_CFoundation_CIDeferralFactory_AddRef
#define IDeferralFactory_Release __x_ABI_CWindows_CFoundation_CIDeferralFactory_Release
#define IDeferralFactory_GetIids __x_ABI_CWindows_CFoundation_CIDeferralFactory_GetIids
#define IDeferralFactory_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIDeferralFactory_GetRuntimeClassName
#define IDeferralFactory_GetTrustLevel __x_ABI_CWindows_CFoundation_CIDeferralFactory_GetTrustLevel
#define IDeferralFactory_Create __x_ABI_CWindows_CFoundation_CIDeferralFactory_Create
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CFoundation_CIDeferralFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IGetActivationFactory interface
 */
#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIGetActivationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIGetActivationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIGetActivationFactory, 0x4edb8ee2, 0x96dd, 0x49a7, 0x94,0xf7, 0x46,0x07,0xdd,0xab,0x8e,0x3c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("4edb8ee2-96dd-49a7-94f7-4607ddab8e3c")
            IGetActivationFactory : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetActivationFactory(
                    HSTRING activatable_class_id,
                    IInspectable **factory) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIGetActivationFactory, 0x4edb8ee2, 0x96dd, 0x49a7, 0x94,0xf7, 0x46,0x07,0xdd,0xab,0x8e,0x3c)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIGetActivationFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IGetActivationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *GetActivationFactory)(
        __x_ABI_CWindows_CFoundation_CIGetActivationFactory *This,
        HSTRING activatable_class_id,
        IInspectable **factory);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIGetActivationFactoryVtbl;

interface __x_ABI_CWindows_CFoundation_CIGetActivationFactory {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIGetActivationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIGetActivationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIGetActivationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIGetActivationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGetActivationFactory methods ***/
#define __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetActivationFactory(This,activatable_class_id,factory) (This)->lpVtbl->GetActivationFactory(This,activatable_class_id,factory)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIGetActivationFactory_QueryInterface(__x_ABI_CWindows_CFoundation_CIGetActivationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIGetActivationFactory_AddRef(__x_ABI_CWindows_CFoundation_CIGetActivationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIGetActivationFactory_Release(__x_ABI_CWindows_CFoundation_CIGetActivationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetIids(__x_ABI_CWindows_CFoundation_CIGetActivationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIGetActivationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIGetActivationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGetActivationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetActivationFactory(__x_ABI_CWindows_CFoundation_CIGetActivationFactory* This,HSTRING activatable_class_id,IInspectable **factory) {
    return This->lpVtbl->GetActivationFactory(This,activatable_class_id,factory);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IGetActivationFactory IID___x_ABI_CWindows_CFoundation_CIGetActivationFactory
#define IGetActivationFactoryVtbl __x_ABI_CWindows_CFoundation_CIGetActivationFactoryVtbl
#define IGetActivationFactory __x_ABI_CWindows_CFoundation_CIGetActivationFactory
#define IGetActivationFactory_QueryInterface __x_ABI_CWindows_CFoundation_CIGetActivationFactory_QueryInterface
#define IGetActivationFactory_AddRef __x_ABI_CWindows_CFoundation_CIGetActivationFactory_AddRef
#define IGetActivationFactory_Release __x_ABI_CWindows_CFoundation_CIGetActivationFactory_Release
#define IGetActivationFactory_GetIids __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetIids
#define IGetActivationFactory_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetRuntimeClassName
#define IGetActivationFactory_GetTrustLevel __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetTrustLevel
#define IGetActivationFactory_GetActivationFactory __x_ABI_CWindows_CFoundation_CIGetActivationFactory_GetActivationFactory
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*****************************************************************************
 * IAsyncAction interface
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIAsyncAction_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIAsyncAction_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIAsyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("5a648006-843a-4da9-865b-9d26e5dfad7b")
            IAsyncAction : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE put_Completed(
                    ABI::Windows::Foundation::IAsyncActionCompletedHandler *handler) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Completed(
                    ABI::Windows::Foundation::IAsyncActionCompletedHandler **handler) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetResults(
                    ) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIAsyncAction, 0x5a648006, 0x843a, 0x4da9, 0x86,0x5b, 0x9d,0x26,0xe5,0xdf,0xad,0x7b)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIAsyncActionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncAction methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __x_ABI_CWindows_CFoundation_CIAsyncAction *This,
        __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __x_ABI_CWindows_CFoundation_CIAsyncAction *This,
        __x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __x_ABI_CWindows_CFoundation_CIAsyncAction *This);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIAsyncActionVtbl;

interface __x_ABI_CWindows_CFoundation_CIAsyncAction {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIAsyncActionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIAsyncAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIAsyncAction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIAsyncAction_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIAsyncAction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIAsyncAction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIAsyncAction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncAction methods ***/
#define __x_ABI_CWindows_CFoundation_CIAsyncAction_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __x_ABI_CWindows_CFoundation_CIAsyncAction_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __x_ABI_CWindows_CFoundation_CIAsyncAction_GetResults(This) (This)->lpVtbl->GetResults(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIAsyncAction_QueryInterface(__x_ABI_CWindows_CFoundation_CIAsyncAction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIAsyncAction_AddRef(__x_ABI_CWindows_CFoundation_CIAsyncAction* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIAsyncAction_Release(__x_ABI_CWindows_CFoundation_CIAsyncAction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIAsyncAction_GetIids(__x_ABI_CWindows_CFoundation_CIAsyncAction* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIAsyncAction_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIAsyncAction* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIAsyncAction_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIAsyncAction* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncAction methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIAsyncAction_put_Completed(__x_ABI_CWindows_CFoundation_CIAsyncAction* This,__x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIAsyncAction_get_Completed(__x_ABI_CWindows_CFoundation_CIAsyncAction* This,__x_ABI_CWindows_CFoundation_CIAsyncActionCompletedHandler **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIAsyncAction_GetResults(__x_ABI_CWindows_CFoundation_CIAsyncAction* This) {
    return This->lpVtbl->GetResults(This);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncAction IID___x_ABI_CWindows_CFoundation_CIAsyncAction
#define IAsyncActionVtbl __x_ABI_CWindows_CFoundation_CIAsyncActionVtbl
#define IAsyncAction __x_ABI_CWindows_CFoundation_CIAsyncAction
#define IAsyncAction_QueryInterface __x_ABI_CWindows_CFoundation_CIAsyncAction_QueryInterface
#define IAsyncAction_AddRef __x_ABI_CWindows_CFoundation_CIAsyncAction_AddRef
#define IAsyncAction_Release __x_ABI_CWindows_CFoundation_CIAsyncAction_Release
#define IAsyncAction_GetIids __x_ABI_CWindows_CFoundation_CIAsyncAction_GetIids
#define IAsyncAction_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIAsyncAction_GetRuntimeClassName
#define IAsyncAction_GetTrustLevel __x_ABI_CWindows_CFoundation_CIAsyncAction_GetTrustLevel
#define IAsyncAction_put_Completed __x_ABI_CWindows_CFoundation_CIAsyncAction_put_Completed
#define IAsyncAction_get_Completed __x_ABI_CWindows_CFoundation_CIAsyncAction_get_Completed
#define IAsyncAction_GetResults __x_ABI_CWindows_CFoundation_CIAsyncAction_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CFoundation_CIAsyncAction_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IMemoryBuffer interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIMemoryBuffer_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIMemoryBuffer_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIMemoryBuffer, 0xfbc4dd2a, 0x245b, 0x11e4, 0xaf,0x98, 0x68,0x94,0x23,0x26,0x0c,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("fbc4dd2a-245b-11e4-af98-689423260cf8")
            IMemoryBuffer : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE CreateReference(
                    ABI::Windows::Foundation::IMemoryBufferReference **reference) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIMemoryBuffer, 0xfbc4dd2a, 0x245b, 0x11e4, 0xaf,0x98, 0x68,0x94,0x23,0x26,0x0c,0xf8)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIMemoryBufferVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMemoryBuffer methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateReference)(
        __x_ABI_CWindows_CFoundation_CIMemoryBuffer *This,
        __x_ABI_CWindows_CFoundation_CIMemoryBufferReference **reference);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIMemoryBufferVtbl;

interface __x_ABI_CWindows_CFoundation_CIMemoryBuffer {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIMemoryBufferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIMemoryBuffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIMemoryBuffer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIMemoryBuffer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIMemoryBuffer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIMemoryBuffer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIMemoryBuffer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMemoryBuffer methods ***/
#define __x_ABI_CWindows_CFoundation_CIMemoryBuffer_CreateReference(This,reference) (This)->lpVtbl->CreateReference(This,reference)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBuffer_QueryInterface(__x_ABI_CWindows_CFoundation_CIMemoryBuffer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIMemoryBuffer_AddRef(__x_ABI_CWindows_CFoundation_CIMemoryBuffer* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIMemoryBuffer_Release(__x_ABI_CWindows_CFoundation_CIMemoryBuffer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBuffer_GetIids(__x_ABI_CWindows_CFoundation_CIMemoryBuffer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBuffer_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIMemoryBuffer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBuffer_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIMemoryBuffer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMemoryBuffer methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBuffer_CreateReference(__x_ABI_CWindows_CFoundation_CIMemoryBuffer* This,__x_ABI_CWindows_CFoundation_CIMemoryBufferReference **reference) {
    return This->lpVtbl->CreateReference(This,reference);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IMemoryBuffer IID___x_ABI_CWindows_CFoundation_CIMemoryBuffer
#define IMemoryBufferVtbl __x_ABI_CWindows_CFoundation_CIMemoryBufferVtbl
#define IMemoryBuffer __x_ABI_CWindows_CFoundation_CIMemoryBuffer
#define IMemoryBuffer_QueryInterface __x_ABI_CWindows_CFoundation_CIMemoryBuffer_QueryInterface
#define IMemoryBuffer_AddRef __x_ABI_CWindows_CFoundation_CIMemoryBuffer_AddRef
#define IMemoryBuffer_Release __x_ABI_CWindows_CFoundation_CIMemoryBuffer_Release
#define IMemoryBuffer_GetIids __x_ABI_CWindows_CFoundation_CIMemoryBuffer_GetIids
#define IMemoryBuffer_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIMemoryBuffer_GetRuntimeClassName
#define IMemoryBuffer_GetTrustLevel __x_ABI_CWindows_CFoundation_CIMemoryBuffer_GetTrustLevel
#define IMemoryBuffer_CreateReference __x_ABI_CWindows_CFoundation_CIMemoryBuffer_CreateReference
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*****************************************************************************
 * IMemoryBufferFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIMemoryBufferFactory, 0xfbc4dd2b, 0x245b, 0x11e4, 0xaf,0x98, 0x68,0x94,0x23,0x26,0x0c,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("fbc4dd2b-245b-11e4-af98-689423260cf8")
            IMemoryBufferFactory : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE Create(
                    UINT32 capacity,
                    ABI::Windows::Foundation::IMemoryBuffer **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIMemoryBufferFactory, 0xfbc4dd2b, 0x245b, 0x11e4, 0xaf,0x98, 0x68,0x94,0x23,0x26,0x0c,0xf8)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIMemoryBufferFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMemoryBufferFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory *This,
        UINT32 capacity,
        __x_ABI_CWindows_CFoundation_CIMemoryBuffer **value);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIMemoryBufferFactoryVtbl;

interface __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIMemoryBufferFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMemoryBufferFactory methods ***/
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_Create(This,capacity,value) (This)->lpVtbl->Create(This,capacity,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_QueryInterface(__x_ABI_CWindows_CFoundation_CIMemoryBufferFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_AddRef(__x_ABI_CWindows_CFoundation_CIMemoryBufferFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_Release(__x_ABI_CWindows_CFoundation_CIMemoryBufferFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_GetIids(__x_ABI_CWindows_CFoundation_CIMemoryBufferFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIMemoryBufferFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIMemoryBufferFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMemoryBufferFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_Create(__x_ABI_CWindows_CFoundation_CIMemoryBufferFactory* This,UINT32 capacity,__x_ABI_CWindows_CFoundation_CIMemoryBuffer **value) {
    return This->lpVtbl->Create(This,capacity,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IMemoryBufferFactory IID___x_ABI_CWindows_CFoundation_CIMemoryBufferFactory
#define IMemoryBufferFactoryVtbl __x_ABI_CWindows_CFoundation_CIMemoryBufferFactoryVtbl
#define IMemoryBufferFactory __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory
#define IMemoryBufferFactory_QueryInterface __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_QueryInterface
#define IMemoryBufferFactory_AddRef __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_AddRef
#define IMemoryBufferFactory_Release __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_Release
#define IMemoryBufferFactory_GetIids __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_GetIids
#define IMemoryBufferFactory_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_GetRuntimeClassName
#define IMemoryBufferFactory_GetTrustLevel __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_GetTrustLevel
#define IMemoryBufferFactory_Create __x_ABI_CWindows_CFoundation_CIMemoryBufferFactory_Create
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*****************************************************************************
 * IMemoryBufferReference interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIMemoryBufferReference_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIMemoryBufferReference_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIMemoryBufferReference, 0xfbc4dd29, 0x245b, 0x11e4, 0xaf,0x98, 0x68,0x94,0x23,0x26,0x0c,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("fbc4dd29-245b-11e4-af98-689423260cf8")
            IMemoryBufferReference : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Capacity(
                    UINT32 *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE add_Closed(
                    ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Foundation::IMemoryBufferReference*,IInspectable* > *handler,
                    EventRegistrationToken *cookie) = 0;

                virtual HRESULT STDMETHODCALLTYPE remove_Closed(
                    EventRegistrationToken cookie) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIMemoryBufferReference, 0xfbc4dd29, 0x245b, 0x11e4, 0xaf,0x98, 0x68,0x94,0x23,0x26,0x0c,0xf8)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIMemoryBufferReferenceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMemoryBufferReference methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Capacity)(
        __x_ABI_CWindows_CFoundation_CIMemoryBufferReference *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *add_Closed)(
        __x_ABI_CWindows_CFoundation_CIMemoryBufferReference *This,
        __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_Closed)(
        __x_ABI_CWindows_CFoundation_CIMemoryBufferReference *This,
        EventRegistrationToken cookie);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIMemoryBufferReferenceVtbl;

interface __x_ABI_CWindows_CFoundation_CIMemoryBufferReference {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIMemoryBufferReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMemoryBufferReference methods ***/
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_get_Capacity(This,value) (This)->lpVtbl->get_Capacity(This,value)
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_add_Closed(This,handler,cookie) (This)->lpVtbl->add_Closed(This,handler,cookie)
#define __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_remove_Closed(This,cookie) (This)->lpVtbl->remove_Closed(This,cookie)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_QueryInterface(__x_ABI_CWindows_CFoundation_CIMemoryBufferReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_AddRef(__x_ABI_CWindows_CFoundation_CIMemoryBufferReference* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_Release(__x_ABI_CWindows_CFoundation_CIMemoryBufferReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_GetIids(__x_ABI_CWindows_CFoundation_CIMemoryBufferReference* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIMemoryBufferReference* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIMemoryBufferReference* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMemoryBufferReference methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_get_Capacity(__x_ABI_CWindows_CFoundation_CIMemoryBufferReference* This,UINT32 *value) {
    return This->lpVtbl->get_Capacity(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_add_Closed(__x_ABI_CWindows_CFoundation_CIMemoryBufferReference* This,__FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_Closed(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_remove_Closed(__x_ABI_CWindows_CFoundation_CIMemoryBufferReference* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_Closed(This,cookie);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IMemoryBufferReference IID___x_ABI_CWindows_CFoundation_CIMemoryBufferReference
#define IMemoryBufferReferenceVtbl __x_ABI_CWindows_CFoundation_CIMemoryBufferReferenceVtbl
#define IMemoryBufferReference __x_ABI_CWindows_CFoundation_CIMemoryBufferReference
#define IMemoryBufferReference_QueryInterface __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_QueryInterface
#define IMemoryBufferReference_AddRef __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_AddRef
#define IMemoryBufferReference_Release __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_Release
#define IMemoryBufferReference_GetIids __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_GetIids
#define IMemoryBufferReference_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_GetRuntimeClassName
#define IMemoryBufferReference_GetTrustLevel __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_GetTrustLevel
#define IMemoryBufferReference_get_Capacity __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_get_Capacity
#define IMemoryBufferReference_add_Closed __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_add_Closed
#define IMemoryBufferReference_remove_Closed __x_ABI_CWindows_CFoundation_CIMemoryBufferReference_remove_Closed
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*****************************************************************************
 * IPropertyValue interface
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIPropertyValue_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIPropertyValue_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIPropertyValue, 0x4bd682dd, 0x7554, 0x40e9, 0x9a,0x9b, 0x82,0x65,0x4e,0xde,0x7e,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("4bd682dd-7554-40e9-9a9b-82654ede7e62")
            IPropertyValue : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Type(
                    ABI::Windows::Foundation::PropertyType *value) = 0;

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

                virtual HRESULT STDMETHODCALLTYPE GetUInt8(
                    BYTE *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetInt16(
                    INT16 *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetUInt16(
                    UINT16 *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetInt32(
                    INT32 *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetUInt32(
                    UINT32 *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetInt64(
                    INT64 *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetUInt64(
                    UINT64 *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetSingle(
                    FLOAT *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetDouble(
                    DOUBLE *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetChar16(
                    WCHAR *value) = 0;

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

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

                virtual HRESULT STDMETHODCALLTYPE GetGuid(
                    GUID *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetDateTime(
                    ABI::Windows::Foundation::DateTime *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetTimeSpan(
                    ABI::Windows::Foundation::TimeSpan *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetPoint(
                    ABI::Windows::Foundation::Point *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetSize(
                    ABI::Windows::Foundation::Size *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetRect(
                    ABI::Windows::Foundation::Rect *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetUInt8Array(
                    UINT32 *value_size,
                    BYTE **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetInt16Array(
                    UINT32 *value_size,
                    INT16 **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetUInt16Array(
                    UINT32 *value_size,
                    UINT16 **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetInt32Array(
                    UINT32 *value_size,
                    INT32 **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetUInt32Array(
                    UINT32 *value_size,
                    UINT32 **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetInt64Array(
                    UINT32 *value_size,
                    INT64 **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetUInt64Array(
                    UINT32 *value_size,
                    UINT64 **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetSingleArray(
                    UINT32 *value_size,
                    FLOAT **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetDoubleArray(
                    UINT32 *value_size,
                    DOUBLE **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetChar16Array(
                    UINT32 *value_size,
                    WCHAR **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetBooleanArray(
                    UINT32 *value_size,
                    boolean **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetStringArray(
                    UINT32 *value_size,
                    HSTRING **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetInspectableArray(
                    UINT32 *value_size,
                    IInspectable ***value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetGuidArray(
                    UINT32 *value_size,
                    GUID **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetDateTimeArray(
                    UINT32 *value_size,
                    ABI::Windows::Foundation::DateTime **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetTimeSpanArray(
                    UINT32 *value_size,
                    ABI::Windows::Foundation::TimeSpan **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetPointArray(
                    UINT32 *value_size,
                    ABI::Windows::Foundation::Point **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetSizeArray(
                    UINT32 *value_size,
                    ABI::Windows::Foundation::Size **value) = 0;

                virtual HRESULT STDMETHODCALLTYPE GetRectArray(
                    UINT32 *value_size,
                    ABI::Windows::Foundation::Rect **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIPropertyValue, 0x4bd682dd, 0x7554, 0x40e9, 0x9a,0x9b, 0x82,0x65,0x4e,0xde,0x7e,0x62)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIPropertyValueVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPropertyValue methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Type)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        __x_ABI_CWindows_CFoundation_CPropertyType *value);

    HRESULT (STDMETHODCALLTYPE *get_IsNumericScalar)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetUInt8)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        BYTE *value);

    HRESULT (STDMETHODCALLTYPE *GetInt16)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        INT16 *value);

    HRESULT (STDMETHODCALLTYPE *GetUInt16)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT16 *value);

    HRESULT (STDMETHODCALLTYPE *GetInt32)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetUInt32)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetInt64)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        INT64 *value);

    HRESULT (STDMETHODCALLTYPE *GetUInt64)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT64 *value);

    HRESULT (STDMETHODCALLTYPE *GetSingle)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *GetDouble)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *GetChar16)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        WCHAR *value);

    HRESULT (STDMETHODCALLTYPE *GetBoolean)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetString)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *GetGuid)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        GUID *value);

    HRESULT (STDMETHODCALLTYPE *GetDateTime)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *GetTimeSpan)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *GetPoint)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        __x_ABI_CWindows_CFoundation_CPoint *value);

    HRESULT (STDMETHODCALLTYPE *GetSize)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        __x_ABI_CWindows_CFoundation_CSize *value);

    HRESULT (STDMETHODCALLTYPE *GetRect)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        __x_ABI_CWindows_CFoundation_CRect *value);

    HRESULT (STDMETHODCALLTYPE *GetUInt8Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        BYTE **value);

    HRESULT (STDMETHODCALLTYPE *GetInt16Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        INT16 **value);

    HRESULT (STDMETHODCALLTYPE *GetUInt16Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        UINT16 **value);

    HRESULT (STDMETHODCALLTYPE *GetInt32Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        INT32 **value);

    HRESULT (STDMETHODCALLTYPE *GetUInt32Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        UINT32 **value);

    HRESULT (STDMETHODCALLTYPE *GetInt64Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        INT64 **value);

    HRESULT (STDMETHODCALLTYPE *GetUInt64Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        UINT64 **value);

    HRESULT (STDMETHODCALLTYPE *GetSingleArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        FLOAT **value);

    HRESULT (STDMETHODCALLTYPE *GetDoubleArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        DOUBLE **value);

    HRESULT (STDMETHODCALLTYPE *GetChar16Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        WCHAR **value);

    HRESULT (STDMETHODCALLTYPE *GetBooleanArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        boolean **value);

    HRESULT (STDMETHODCALLTYPE *GetStringArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *GetInspectableArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        IInspectable ***value);

    HRESULT (STDMETHODCALLTYPE *GetGuidArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        GUID **value);

    HRESULT (STDMETHODCALLTYPE *GetDateTimeArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        __x_ABI_CWindows_CFoundation_CDateTime **value);

    HRESULT (STDMETHODCALLTYPE *GetTimeSpanArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        __x_ABI_CWindows_CFoundation_CTimeSpan **value);

    HRESULT (STDMETHODCALLTYPE *GetPointArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        __x_ABI_CWindows_CFoundation_CPoint **value);

    HRESULT (STDMETHODCALLTYPE *GetSizeArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        __x_ABI_CWindows_CFoundation_CSize **value);

    HRESULT (STDMETHODCALLTYPE *GetRectArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValue *This,
        UINT32 *value_size,
        __x_ABI_CWindows_CFoundation_CRect **value);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIPropertyValueVtbl;

interface __x_ABI_CWindows_CFoundation_CIPropertyValue {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIPropertyValueVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPropertyValue methods ***/
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_get_Type(This,value) (This)->lpVtbl->get_Type(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_get_IsNumericScalar(This,value) (This)->lpVtbl->get_IsNumericScalar(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt8(This,value) (This)->lpVtbl->GetUInt8(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt16(This,value) (This)->lpVtbl->GetInt16(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt16(This,value) (This)->lpVtbl->GetUInt16(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt32(This,value) (This)->lpVtbl->GetInt32(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt32(This,value) (This)->lpVtbl->GetUInt32(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt64(This,value) (This)->lpVtbl->GetInt64(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt64(This,value) (This)->lpVtbl->GetUInt64(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSingle(This,value) (This)->lpVtbl->GetSingle(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDouble(This,value) (This)->lpVtbl->GetDouble(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetChar16(This,value) (This)->lpVtbl->GetChar16(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetBoolean(This,value) (This)->lpVtbl->GetBoolean(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetString(This,value) (This)->lpVtbl->GetString(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetGuid(This,value) (This)->lpVtbl->GetGuid(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDateTime(This,value) (This)->lpVtbl->GetDateTime(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetTimeSpan(This,value) (This)->lpVtbl->GetTimeSpan(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetPoint(This,value) (This)->lpVtbl->GetPoint(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSize(This,value) (This)->lpVtbl->GetSize(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetRect(This,value) (This)->lpVtbl->GetRect(This,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt8Array(This,value_size,value) (This)->lpVtbl->GetUInt8Array(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt16Array(This,value_size,value) (This)->lpVtbl->GetInt16Array(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt16Array(This,value_size,value) (This)->lpVtbl->GetUInt16Array(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt32Array(This,value_size,value) (This)->lpVtbl->GetInt32Array(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt32Array(This,value_size,value) (This)->lpVtbl->GetUInt32Array(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt64Array(This,value_size,value) (This)->lpVtbl->GetInt64Array(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt64Array(This,value_size,value) (This)->lpVtbl->GetUInt64Array(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSingleArray(This,value_size,value) (This)->lpVtbl->GetSingleArray(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDoubleArray(This,value_size,value) (This)->lpVtbl->GetDoubleArray(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetChar16Array(This,value_size,value) (This)->lpVtbl->GetChar16Array(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetBooleanArray(This,value_size,value) (This)->lpVtbl->GetBooleanArray(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetStringArray(This,value_size,value) (This)->lpVtbl->GetStringArray(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInspectableArray(This,value_size,value) (This)->lpVtbl->GetInspectableArray(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetGuidArray(This,value_size,value) (This)->lpVtbl->GetGuidArray(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDateTimeArray(This,value_size,value) (This)->lpVtbl->GetDateTimeArray(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetTimeSpanArray(This,value_size,value) (This)->lpVtbl->GetTimeSpanArray(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetPointArray(This,value_size,value) (This)->lpVtbl->GetPointArray(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSizeArray(This,value_size,value) (This)->lpVtbl->GetSizeArray(This,value_size,value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValue_GetRectArray(This,value_size,value) (This)->lpVtbl->GetRectArray(This,value_size,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_QueryInterface(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIPropertyValue_AddRef(__x_ABI_CWindows_CFoundation_CIPropertyValue* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIPropertyValue_Release(__x_ABI_CWindows_CFoundation_CIPropertyValue* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetIids(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPropertyValue methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_get_Type(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,__x_ABI_CWindows_CFoundation_CPropertyType *value) {
    return This->lpVtbl->get_Type(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_get_IsNumericScalar(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,boolean *value) {
    return This->lpVtbl->get_IsNumericScalar(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt8(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,BYTE *value) {
    return This->lpVtbl->GetUInt8(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt16(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,INT16 *value) {
    return This->lpVtbl->GetInt16(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt16(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT16 *value) {
    return This->lpVtbl->GetUInt16(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt32(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,INT32 *value) {
    return This->lpVtbl->GetInt32(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt32(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value) {
    return This->lpVtbl->GetUInt32(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt64(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,INT64 *value) {
    return This->lpVtbl->GetInt64(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt64(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT64 *value) {
    return This->lpVtbl->GetUInt64(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSingle(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,FLOAT *value) {
    return This->lpVtbl->GetSingle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDouble(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,DOUBLE *value) {
    return This->lpVtbl->GetDouble(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetChar16(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,WCHAR *value) {
    return This->lpVtbl->GetChar16(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetBoolean(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,boolean *value) {
    return This->lpVtbl->GetBoolean(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetString(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,HSTRING *value) {
    return This->lpVtbl->GetString(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetGuid(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,GUID *value) {
    return This->lpVtbl->GetGuid(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDateTime(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->GetDateTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetTimeSpan(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->GetTimeSpan(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetPoint(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,__x_ABI_CWindows_CFoundation_CPoint *value) {
    return This->lpVtbl->GetPoint(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSize(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,__x_ABI_CWindows_CFoundation_CSize *value) {
    return This->lpVtbl->GetSize(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetRect(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,__x_ABI_CWindows_CFoundation_CRect *value) {
    return This->lpVtbl->GetRect(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt8Array(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,BYTE **value) {
    return This->lpVtbl->GetUInt8Array(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt16Array(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,INT16 **value) {
    return This->lpVtbl->GetInt16Array(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt16Array(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,UINT16 **value) {
    return This->lpVtbl->GetUInt16Array(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt32Array(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,INT32 **value) {
    return This->lpVtbl->GetInt32Array(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt32Array(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,UINT32 **value) {
    return This->lpVtbl->GetUInt32Array(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt64Array(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,INT64 **value) {
    return This->lpVtbl->GetInt64Array(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt64Array(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,UINT64 **value) {
    return This->lpVtbl->GetUInt64Array(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSingleArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,FLOAT **value) {
    return This->lpVtbl->GetSingleArray(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDoubleArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,DOUBLE **value) {
    return This->lpVtbl->GetDoubleArray(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetChar16Array(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,WCHAR **value) {
    return This->lpVtbl->GetChar16Array(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetBooleanArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,boolean **value) {
    return This->lpVtbl->GetBooleanArray(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetStringArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,HSTRING **value) {
    return This->lpVtbl->GetStringArray(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInspectableArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,IInspectable ***value) {
    return This->lpVtbl->GetInspectableArray(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetGuidArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,GUID **value) {
    return This->lpVtbl->GetGuidArray(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDateTimeArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,__x_ABI_CWindows_CFoundation_CDateTime **value) {
    return This->lpVtbl->GetDateTimeArray(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetTimeSpanArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,__x_ABI_CWindows_CFoundation_CTimeSpan **value) {
    return This->lpVtbl->GetTimeSpanArray(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetPointArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,__x_ABI_CWindows_CFoundation_CPoint **value) {
    return This->lpVtbl->GetPointArray(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSizeArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,__x_ABI_CWindows_CFoundation_CSize **value) {
    return This->lpVtbl->GetSizeArray(This,value_size,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValue_GetRectArray(__x_ABI_CWindows_CFoundation_CIPropertyValue* This,UINT32 *value_size,__x_ABI_CWindows_CFoundation_CRect **value) {
    return This->lpVtbl->GetRectArray(This,value_size,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IPropertyValue IID___x_ABI_CWindows_CFoundation_CIPropertyValue
#define IPropertyValueVtbl __x_ABI_CWindows_CFoundation_CIPropertyValueVtbl
#define IPropertyValue __x_ABI_CWindows_CFoundation_CIPropertyValue
#define IPropertyValue_QueryInterface __x_ABI_CWindows_CFoundation_CIPropertyValue_QueryInterface
#define IPropertyValue_AddRef __x_ABI_CWindows_CFoundation_CIPropertyValue_AddRef
#define IPropertyValue_Release __x_ABI_CWindows_CFoundation_CIPropertyValue_Release
#define IPropertyValue_GetIids __x_ABI_CWindows_CFoundation_CIPropertyValue_GetIids
#define IPropertyValue_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIPropertyValue_GetRuntimeClassName
#define IPropertyValue_GetTrustLevel __x_ABI_CWindows_CFoundation_CIPropertyValue_GetTrustLevel
#define IPropertyValue_get_Type __x_ABI_CWindows_CFoundation_CIPropertyValue_get_Type
#define IPropertyValue_get_IsNumericScalar __x_ABI_CWindows_CFoundation_CIPropertyValue_get_IsNumericScalar
#define IPropertyValue_GetUInt8 __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt8
#define IPropertyValue_GetInt16 __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt16
#define IPropertyValue_GetUInt16 __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt16
#define IPropertyValue_GetInt32 __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt32
#define IPropertyValue_GetUInt32 __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt32
#define IPropertyValue_GetInt64 __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt64
#define IPropertyValue_GetUInt64 __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt64
#define IPropertyValue_GetSingle __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSingle
#define IPropertyValue_GetDouble __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDouble
#define IPropertyValue_GetChar16 __x_ABI_CWindows_CFoundation_CIPropertyValue_GetChar16
#define IPropertyValue_GetBoolean __x_ABI_CWindows_CFoundation_CIPropertyValue_GetBoolean
#define IPropertyValue_GetString __x_ABI_CWindows_CFoundation_CIPropertyValue_GetString
#define IPropertyValue_GetGuid __x_ABI_CWindows_CFoundation_CIPropertyValue_GetGuid
#define IPropertyValue_GetDateTime __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDateTime
#define IPropertyValue_GetTimeSpan __x_ABI_CWindows_CFoundation_CIPropertyValue_GetTimeSpan
#define IPropertyValue_GetPoint __x_ABI_CWindows_CFoundation_CIPropertyValue_GetPoint
#define IPropertyValue_GetSize __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSize
#define IPropertyValue_GetRect __x_ABI_CWindows_CFoundation_CIPropertyValue_GetRect
#define IPropertyValue_GetUInt8Array __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt8Array
#define IPropertyValue_GetInt16Array __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt16Array
#define IPropertyValue_GetUInt16Array __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt16Array
#define IPropertyValue_GetInt32Array __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt32Array
#define IPropertyValue_GetUInt32Array __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt32Array
#define IPropertyValue_GetInt64Array __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInt64Array
#define IPropertyValue_GetUInt64Array __x_ABI_CWindows_CFoundation_CIPropertyValue_GetUInt64Array
#define IPropertyValue_GetSingleArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSingleArray
#define IPropertyValue_GetDoubleArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDoubleArray
#define IPropertyValue_GetChar16Array __x_ABI_CWindows_CFoundation_CIPropertyValue_GetChar16Array
#define IPropertyValue_GetBooleanArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetBooleanArray
#define IPropertyValue_GetStringArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetStringArray
#define IPropertyValue_GetInspectableArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetInspectableArray
#define IPropertyValue_GetGuidArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetGuidArray
#define IPropertyValue_GetDateTimeArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetDateTimeArray
#define IPropertyValue_GetTimeSpanArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetTimeSpanArray
#define IPropertyValue_GetPointArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetPointArray
#define IPropertyValue_GetSizeArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetSizeArray
#define IPropertyValue_GetRectArray __x_ABI_CWindows_CFoundation_CIPropertyValue_GetRectArray
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CFoundation_CIPropertyValue_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPropertyValueStatics interface
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIPropertyValueStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIPropertyValueStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIPropertyValueStatics, 0x629bdbc8, 0xd932, 0x4ff4, 0x96,0xb9, 0x8d,0x96,0xc5,0xc1,0xe8,0x58);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("629bdbc8-d932-4ff4-96b9-8d96c5c1e858")
            IPropertyValueStatics : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE CreateEmpty(
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateUInt8(
                    BYTE value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateInt16(
                    INT16 value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateUInt16(
                    UINT16 value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateInt32(
                    INT32 value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateUInt32(
                    UINT32 value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateInt64(
                    INT64 value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateUInt64(
                    UINT64 value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateSingle(
                    FLOAT value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateDouble(
                    DOUBLE value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateChar16(
                    WCHAR value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateBoolean(
                    boolean value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateString(
                    HSTRING value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateInspectable(
                    IInspectable *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateGuid(
                    GUID value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateDateTime(
                    ABI::Windows::Foundation::DateTime value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateTimeSpan(
                    ABI::Windows::Foundation::TimeSpan value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreatePoint(
                    ABI::Windows::Foundation::Point value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateSize(
                    ABI::Windows::Foundation::Size value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateRect(
                    ABI::Windows::Foundation::Rect value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateUInt8Array(
                    UINT32 value_size,
                    BYTE *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateInt16Array(
                    UINT32 value_size,
                    INT16 *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateUInt16Array(
                    UINT32 value_size,
                    UINT16 *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateInt32Array(
                    UINT32 value_size,
                    INT32 *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateUInt32Array(
                    UINT32 value_size,
                    UINT32 *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateInt64Array(
                    UINT32 value_size,
                    INT64 *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateUInt64Array(
                    UINT32 value_size,
                    UINT64 *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateSingleArray(
                    UINT32 value_size,
                    FLOAT *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateDoubleArray(
                    UINT32 value_size,
                    DOUBLE *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateChar16Array(
                    UINT32 value_size,
                    WCHAR *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateBooleanArray(
                    UINT32 value_size,
                    boolean *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateStringArray(
                    UINT32 value_size,
                    HSTRING *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateInspectableArray(
                    UINT32 value_size,
                    IInspectable **value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateGuidArray(
                    UINT32 value_size,
                    GUID *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateDateTimeArray(
                    UINT32 value_size,
                    ABI::Windows::Foundation::DateTime *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateTimeSpanArray(
                    UINT32 value_size,
                    ABI::Windows::Foundation::TimeSpan *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreatePointArray(
                    UINT32 value_size,
                    ABI::Windows::Foundation::Point *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateSizeArray(
                    UINT32 value_size,
                    ABI::Windows::Foundation::Size *value,
                    IInspectable **property_value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateRectArray(
                    UINT32 value_size,
                    ABI::Windows::Foundation::Rect *value,
                    IInspectable **property_value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics, 0x629bdbc8, 0xd932, 0x4ff4, 0x96,0xb9, 0x8d,0x96,0xc5,0xc1,0xe8,0x58)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIPropertyValueStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IPropertyValueStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateEmpty)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateUInt8)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        BYTE value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateInt16)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        INT16 value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateUInt16)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT16 value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateInt32)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        INT32 value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateUInt32)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateInt64)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        INT64 value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateUInt64)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT64 value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateSingle)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        FLOAT value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateDouble)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        DOUBLE value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateChar16)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        WCHAR value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateBoolean)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        boolean value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateString)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        HSTRING value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateInspectable)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        IInspectable *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateGuid)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        GUID value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateDateTime)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        __x_ABI_CWindows_CFoundation_CDateTime value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateTimeSpan)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreatePoint)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        __x_ABI_CWindows_CFoundation_CPoint value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateSize)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        __x_ABI_CWindows_CFoundation_CSize value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateRect)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        __x_ABI_CWindows_CFoundation_CRect value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateUInt8Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        BYTE *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateInt16Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        INT16 *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateUInt16Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        UINT16 *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateInt32Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        INT32 *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateUInt32Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        UINT32 *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateInt64Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        INT64 *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateUInt64Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        UINT64 *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateSingleArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        FLOAT *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateDoubleArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        DOUBLE *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateChar16Array)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        WCHAR *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateBooleanArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        boolean *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateStringArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        HSTRING *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateInspectableArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        IInspectable **value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateGuidArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        GUID *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateDateTimeArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        __x_ABI_CWindows_CFoundation_CDateTime *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateTimeSpanArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreatePointArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        __x_ABI_CWindows_CFoundation_CPoint *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateSizeArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        __x_ABI_CWindows_CFoundation_CSize *value,
        IInspectable **property_value);

    HRESULT (STDMETHODCALLTYPE *CreateRectArray)(
        __x_ABI_CWindows_CFoundation_CIPropertyValueStatics *This,
        UINT32 value_size,
        __x_ABI_CWindows_CFoundation_CRect *value,
        IInspectable **property_value);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIPropertyValueStaticsVtbl;

interface __x_ABI_CWindows_CFoundation_CIPropertyValueStatics {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIPropertyValueStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPropertyValueStatics methods ***/
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateEmpty(This,property_value) (This)->lpVtbl->CreateEmpty(This,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt8(This,value,property_value) (This)->lpVtbl->CreateUInt8(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt16(This,value,property_value) (This)->lpVtbl->CreateInt16(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt16(This,value,property_value) (This)->lpVtbl->CreateUInt16(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt32(This,value,property_value) (This)->lpVtbl->CreateInt32(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt32(This,value,property_value) (This)->lpVtbl->CreateUInt32(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt64(This,value,property_value) (This)->lpVtbl->CreateInt64(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt64(This,value,property_value) (This)->lpVtbl->CreateUInt64(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSingle(This,value,property_value) (This)->lpVtbl->CreateSingle(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDouble(This,value,property_value) (This)->lpVtbl->CreateDouble(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateChar16(This,value,property_value) (This)->lpVtbl->CreateChar16(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateBoolean(This,value,property_value) (This)->lpVtbl->CreateBoolean(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateString(This,value,property_value) (This)->lpVtbl->CreateString(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInspectable(This,value,property_value) (This)->lpVtbl->CreateInspectable(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateGuid(This,value,property_value) (This)->lpVtbl->CreateGuid(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDateTime(This,value,property_value) (This)->lpVtbl->CreateDateTime(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateTimeSpan(This,value,property_value) (This)->lpVtbl->CreateTimeSpan(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreatePoint(This,value,property_value) (This)->lpVtbl->CreatePoint(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSize(This,value,property_value) (This)->lpVtbl->CreateSize(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateRect(This,value,property_value) (This)->lpVtbl->CreateRect(This,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt8Array(This,value_size,value,property_value) (This)->lpVtbl->CreateUInt8Array(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt16Array(This,value_size,value,property_value) (This)->lpVtbl->CreateInt16Array(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt16Array(This,value_size,value,property_value) (This)->lpVtbl->CreateUInt16Array(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt32Array(This,value_size,value,property_value) (This)->lpVtbl->CreateInt32Array(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt32Array(This,value_size,value,property_value) (This)->lpVtbl->CreateUInt32Array(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt64Array(This,value_size,value,property_value) (This)->lpVtbl->CreateInt64Array(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt64Array(This,value_size,value,property_value) (This)->lpVtbl->CreateUInt64Array(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSingleArray(This,value_size,value,property_value) (This)->lpVtbl->CreateSingleArray(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDoubleArray(This,value_size,value,property_value) (This)->lpVtbl->CreateDoubleArray(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateChar16Array(This,value_size,value,property_value) (This)->lpVtbl->CreateChar16Array(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateBooleanArray(This,value_size,value,property_value) (This)->lpVtbl->CreateBooleanArray(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateStringArray(This,value_size,value,property_value) (This)->lpVtbl->CreateStringArray(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInspectableArray(This,value_size,value,property_value) (This)->lpVtbl->CreateInspectableArray(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateGuidArray(This,value_size,value,property_value) (This)->lpVtbl->CreateGuidArray(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDateTimeArray(This,value_size,value,property_value) (This)->lpVtbl->CreateDateTimeArray(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateTimeSpanArray(This,value_size,value,property_value) (This)->lpVtbl->CreateTimeSpanArray(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreatePointArray(This,value_size,value,property_value) (This)->lpVtbl->CreatePointArray(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSizeArray(This,value_size,value,property_value) (This)->lpVtbl->CreateSizeArray(This,value_size,value,property_value)
#define __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateRectArray(This,value_size,value,property_value) (This)->lpVtbl->CreateRectArray(This,value_size,value,property_value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_QueryInterface(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_AddRef(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_Release(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_GetIids(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPropertyValueStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateEmpty(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,IInspectable **property_value) {
    return This->lpVtbl->CreateEmpty(This,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt8(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,BYTE value,IInspectable **property_value) {
    return This->lpVtbl->CreateUInt8(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt16(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,INT16 value,IInspectable **property_value) {
    return This->lpVtbl->CreateInt16(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt16(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT16 value,IInspectable **property_value) {
    return This->lpVtbl->CreateUInt16(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt32(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,INT32 value,IInspectable **property_value) {
    return This->lpVtbl->CreateInt32(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt32(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value,IInspectable **property_value) {
    return This->lpVtbl->CreateUInt32(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt64(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,INT64 value,IInspectable **property_value) {
    return This->lpVtbl->CreateInt64(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt64(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT64 value,IInspectable **property_value) {
    return This->lpVtbl->CreateUInt64(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSingle(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,FLOAT value,IInspectable **property_value) {
    return This->lpVtbl->CreateSingle(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDouble(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,DOUBLE value,IInspectable **property_value) {
    return This->lpVtbl->CreateDouble(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateChar16(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,WCHAR value,IInspectable **property_value) {
    return This->lpVtbl->CreateChar16(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateBoolean(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,boolean value,IInspectable **property_value) {
    return This->lpVtbl->CreateBoolean(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateString(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,HSTRING value,IInspectable **property_value) {
    return This->lpVtbl->CreateString(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInspectable(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,IInspectable *value,IInspectable **property_value) {
    return This->lpVtbl->CreateInspectable(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateGuid(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,GUID value,IInspectable **property_value) {
    return This->lpVtbl->CreateGuid(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDateTime(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,__x_ABI_CWindows_CFoundation_CDateTime value,IInspectable **property_value) {
    return This->lpVtbl->CreateDateTime(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateTimeSpan(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,__x_ABI_CWindows_CFoundation_CTimeSpan value,IInspectable **property_value) {
    return This->lpVtbl->CreateTimeSpan(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreatePoint(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,__x_ABI_CWindows_CFoundation_CPoint value,IInspectable **property_value) {
    return This->lpVtbl->CreatePoint(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSize(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,__x_ABI_CWindows_CFoundation_CSize value,IInspectable **property_value) {
    return This->lpVtbl->CreateSize(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateRect(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,__x_ABI_CWindows_CFoundation_CRect value,IInspectable **property_value) {
    return This->lpVtbl->CreateRect(This,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt8Array(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,BYTE *value,IInspectable **property_value) {
    return This->lpVtbl->CreateUInt8Array(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt16Array(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,INT16 *value,IInspectable **property_value) {
    return This->lpVtbl->CreateInt16Array(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt16Array(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,UINT16 *value,IInspectable **property_value) {
    return This->lpVtbl->CreateUInt16Array(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt32Array(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,INT32 *value,IInspectable **property_value) {
    return This->lpVtbl->CreateInt32Array(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt32Array(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,UINT32 *value,IInspectable **property_value) {
    return This->lpVtbl->CreateUInt32Array(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt64Array(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,INT64 *value,IInspectable **property_value) {
    return This->lpVtbl->CreateInt64Array(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt64Array(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,UINT64 *value,IInspectable **property_value) {
    return This->lpVtbl->CreateUInt64Array(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSingleArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,FLOAT *value,IInspectable **property_value) {
    return This->lpVtbl->CreateSingleArray(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDoubleArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,DOUBLE *value,IInspectable **property_value) {
    return This->lpVtbl->CreateDoubleArray(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateChar16Array(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,WCHAR *value,IInspectable **property_value) {
    return This->lpVtbl->CreateChar16Array(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateBooleanArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,boolean *value,IInspectable **property_value) {
    return This->lpVtbl->CreateBooleanArray(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateStringArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,HSTRING *value,IInspectable **property_value) {
    return This->lpVtbl->CreateStringArray(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInspectableArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,IInspectable **value,IInspectable **property_value) {
    return This->lpVtbl->CreateInspectableArray(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateGuidArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,GUID *value,IInspectable **property_value) {
    return This->lpVtbl->CreateGuidArray(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDateTimeArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,__x_ABI_CWindows_CFoundation_CDateTime *value,IInspectable **property_value) {
    return This->lpVtbl->CreateDateTimeArray(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateTimeSpanArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,__x_ABI_CWindows_CFoundation_CTimeSpan *value,IInspectable **property_value) {
    return This->lpVtbl->CreateTimeSpanArray(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreatePointArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,__x_ABI_CWindows_CFoundation_CPoint *value,IInspectable **property_value) {
    return This->lpVtbl->CreatePointArray(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSizeArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,__x_ABI_CWindows_CFoundation_CSize *value,IInspectable **property_value) {
    return This->lpVtbl->CreateSizeArray(This,value_size,value,property_value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateRectArray(__x_ABI_CWindows_CFoundation_CIPropertyValueStatics* This,UINT32 value_size,__x_ABI_CWindows_CFoundation_CRect *value,IInspectable **property_value) {
    return This->lpVtbl->CreateRectArray(This,value_size,value,property_value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IPropertyValueStatics IID___x_ABI_CWindows_CFoundation_CIPropertyValueStatics
#define IPropertyValueStaticsVtbl __x_ABI_CWindows_CFoundation_CIPropertyValueStaticsVtbl
#define IPropertyValueStatics __x_ABI_CWindows_CFoundation_CIPropertyValueStatics
#define IPropertyValueStatics_QueryInterface __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_QueryInterface
#define IPropertyValueStatics_AddRef __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_AddRef
#define IPropertyValueStatics_Release __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_Release
#define IPropertyValueStatics_GetIids __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_GetIids
#define IPropertyValueStatics_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_GetRuntimeClassName
#define IPropertyValueStatics_GetTrustLevel __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_GetTrustLevel
#define IPropertyValueStatics_CreateEmpty __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateEmpty
#define IPropertyValueStatics_CreateUInt8 __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt8
#define IPropertyValueStatics_CreateInt16 __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt16
#define IPropertyValueStatics_CreateUInt16 __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt16
#define IPropertyValueStatics_CreateInt32 __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt32
#define IPropertyValueStatics_CreateUInt32 __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt32
#define IPropertyValueStatics_CreateInt64 __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt64
#define IPropertyValueStatics_CreateUInt64 __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt64
#define IPropertyValueStatics_CreateSingle __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSingle
#define IPropertyValueStatics_CreateDouble __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDouble
#define IPropertyValueStatics_CreateChar16 __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateChar16
#define IPropertyValueStatics_CreateBoolean __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateBoolean
#define IPropertyValueStatics_CreateString __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateString
#define IPropertyValueStatics_CreateInspectable __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInspectable
#define IPropertyValueStatics_CreateGuid __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateGuid
#define IPropertyValueStatics_CreateDateTime __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDateTime
#define IPropertyValueStatics_CreateTimeSpan __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateTimeSpan
#define IPropertyValueStatics_CreatePoint __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreatePoint
#define IPropertyValueStatics_CreateSize __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSize
#define IPropertyValueStatics_CreateRect __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateRect
#define IPropertyValueStatics_CreateUInt8Array __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt8Array
#define IPropertyValueStatics_CreateInt16Array __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt16Array
#define IPropertyValueStatics_CreateUInt16Array __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt16Array
#define IPropertyValueStatics_CreateInt32Array __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt32Array
#define IPropertyValueStatics_CreateUInt32Array __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt32Array
#define IPropertyValueStatics_CreateInt64Array __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInt64Array
#define IPropertyValueStatics_CreateUInt64Array __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateUInt64Array
#define IPropertyValueStatics_CreateSingleArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSingleArray
#define IPropertyValueStatics_CreateDoubleArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDoubleArray
#define IPropertyValueStatics_CreateChar16Array __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateChar16Array
#define IPropertyValueStatics_CreateBooleanArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateBooleanArray
#define IPropertyValueStatics_CreateStringArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateStringArray
#define IPropertyValueStatics_CreateInspectableArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateInspectableArray
#define IPropertyValueStatics_CreateGuidArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateGuidArray
#define IPropertyValueStatics_CreateDateTimeArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateDateTimeArray
#define IPropertyValueStatics_CreateTimeSpanArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateTimeSpanArray
#define IPropertyValueStatics_CreatePointArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreatePointArray
#define IPropertyValueStatics_CreateSizeArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateSizeArray
#define IPropertyValueStatics_CreateRectArray __x_ABI_CWindows_CFoundation_CIPropertyValueStatics_CreateRectArray
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CFoundation_CIPropertyValueStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IUriEscapeStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIUriEscapeStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriEscapeStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIUriEscapeStatics, 0xc1d432ba, 0xc824, 0x4452, 0xa7,0xfd, 0x51,0x2b,0xc3,0xbb,0xe9,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("c1d432ba-c824-4452-a7fd-512bc3bbe9a1")
            IUriEscapeStatics : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE UnescapeComponent(
                    HSTRING to_unescape,
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE EscapeComponent(
                    HSTRING to_escape,
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIUriEscapeStatics, 0xc1d432ba, 0xc824, 0x4452, 0xa7,0xfd, 0x51,0x2b,0xc3,0xbb,0xe9,0xa1)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIUriEscapeStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUriEscapeStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *UnescapeComponent)(
        __x_ABI_CWindows_CFoundation_CIUriEscapeStatics *This,
        HSTRING to_unescape,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *EscapeComponent)(
        __x_ABI_CWindows_CFoundation_CIUriEscapeStatics *This,
        HSTRING to_escape,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIUriEscapeStaticsVtbl;

interface __x_ABI_CWindows_CFoundation_CIUriEscapeStatics {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIUriEscapeStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUriEscapeStatics methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_UnescapeComponent(This,to_unescape,value) (This)->lpVtbl->UnescapeComponent(This,to_unescape,value)
#define __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_EscapeComponent(This,to_escape,value) (This)->lpVtbl->EscapeComponent(This,to_escape,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_QueryInterface(__x_ABI_CWindows_CFoundation_CIUriEscapeStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_AddRef(__x_ABI_CWindows_CFoundation_CIUriEscapeStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_Release(__x_ABI_CWindows_CFoundation_CIUriEscapeStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_GetIids(__x_ABI_CWindows_CFoundation_CIUriEscapeStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIUriEscapeStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIUriEscapeStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUriEscapeStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_UnescapeComponent(__x_ABI_CWindows_CFoundation_CIUriEscapeStatics* This,HSTRING to_unescape,HSTRING *value) {
    return This->lpVtbl->UnescapeComponent(This,to_unescape,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_EscapeComponent(__x_ABI_CWindows_CFoundation_CIUriEscapeStatics* This,HSTRING to_escape,HSTRING *value) {
    return This->lpVtbl->EscapeComponent(This,to_escape,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IUriEscapeStatics IID___x_ABI_CWindows_CFoundation_CIUriEscapeStatics
#define IUriEscapeStaticsVtbl __x_ABI_CWindows_CFoundation_CIUriEscapeStaticsVtbl
#define IUriEscapeStatics __x_ABI_CWindows_CFoundation_CIUriEscapeStatics
#define IUriEscapeStatics_QueryInterface __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_QueryInterface
#define IUriEscapeStatics_AddRef __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_AddRef
#define IUriEscapeStatics_Release __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_Release
#define IUriEscapeStatics_GetIids __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_GetIids
#define IUriEscapeStatics_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_GetRuntimeClassName
#define IUriEscapeStatics_GetTrustLevel __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_GetTrustLevel
#define IUriEscapeStatics_UnescapeComponent __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_UnescapeComponent
#define IUriEscapeStatics_EscapeComponent __x_ABI_CWindows_CFoundation_CIUriEscapeStatics_EscapeComponent
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*****************************************************************************
 * IUriRuntimeClass interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIUriRuntimeClass_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriRuntimeClass_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIUriRuntimeClass, 0x9e365e57, 0x48b2, 0x4160, 0x95,0x6f, 0xc7,0x38,0x51,0x20,0xbb,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("9e365e57-48b2-4160-956f-c7385120bbfc")
            IUriRuntimeClass : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_AbsoluteUri(
                    HSTRING *value) = 0;

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

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

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

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

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

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

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

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

                virtual HRESULT STDMETHODCALLTYPE get_QueryParsed(
                    ABI::Windows::Foundation::IWwwFormUrlDecoderRuntimeClass **decoder) = 0;

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

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

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

                virtual HRESULT STDMETHODCALLTYPE get_Port(
                    INT32 *value) = 0;

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

                virtual HRESULT STDMETHODCALLTYPE Equals(
                    ABI::Windows::Foundation::IUriRuntimeClass *uri,
                    boolean *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE CombineUri(
                    HSTRING relative_uri,
                    ABI::Windows::Foundation::IUriRuntimeClass **instance) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass, 0x9e365e57, 0x48b2, 0x4160, 0x95,0x6f, 0xc7,0x38,0x51,0x20,0xbb,0xfc)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIUriRuntimeClassVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUriRuntimeClass methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AbsoluteUri)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_DisplayUri)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Domain)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Extension)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Fragment)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Host)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Password)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Path)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Query)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_QueryParsed)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass **decoder);

    HRESULT (STDMETHODCALLTYPE *get_RawUri)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_SchemeName)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_UserName)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Port)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_Suspicious)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *Equals)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *CombineUri)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *This,
        HSTRING relative_uri,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **instance);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIUriRuntimeClassVtbl;

interface __x_ABI_CWindows_CFoundation_CIUriRuntimeClass {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIUriRuntimeClassVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUriRuntimeClass methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_AbsoluteUri(This,value) (This)->lpVtbl->get_AbsoluteUri(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_DisplayUri(This,value) (This)->lpVtbl->get_DisplayUri(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Domain(This,value) (This)->lpVtbl->get_Domain(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Extension(This,value) (This)->lpVtbl->get_Extension(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Fragment(This,value) (This)->lpVtbl->get_Fragment(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Host(This,value) (This)->lpVtbl->get_Host(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Password(This,value) (This)->lpVtbl->get_Password(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Path(This,value) (This)->lpVtbl->get_Path(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Query(This,value) (This)->lpVtbl->get_Query(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_QueryParsed(This,decoder) (This)->lpVtbl->get_QueryParsed(This,decoder)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_RawUri(This,value) (This)->lpVtbl->get_RawUri(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_SchemeName(This,value) (This)->lpVtbl->get_SchemeName(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_UserName(This,value) (This)->lpVtbl->get_UserName(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Port(This,value) (This)->lpVtbl->get_Port(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Suspicious(This,value) (This)->lpVtbl->get_Suspicious(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_Equals(This,uri,value) (This)->lpVtbl->Equals(This,uri,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_CombineUri(This,relative_uri,instance) (This)->lpVtbl->CombineUri(This,relative_uri,instance)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_QueryInterface(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_AddRef(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_Release(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_GetIids(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUriRuntimeClass methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_AbsoluteUri(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_AbsoluteUri(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_DisplayUri(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayUri(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Domain(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_Domain(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Extension(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_Extension(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Fragment(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_Fragment(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Host(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_Host(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Password(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_Password(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Path(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_Path(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Query(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_Query(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_QueryParsed(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass **decoder) {
    return This->lpVtbl->get_QueryParsed(This,decoder);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_RawUri(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_RawUri(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_SchemeName(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_SchemeName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_UserName(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING *value) {
    return This->lpVtbl->get_UserName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Port(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,INT32 *value) {
    return This->lpVtbl->get_Port(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Suspicious(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,boolean *value) {
    return This->lpVtbl->get_Suspicious(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_Equals(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,boolean *value) {
    return This->lpVtbl->Equals(This,uri,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_CombineUri(__x_ABI_CWindows_CFoundation_CIUriRuntimeClass* This,HSTRING relative_uri,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **instance) {
    return This->lpVtbl->CombineUri(This,relative_uri,instance);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IUriRuntimeClass IID___x_ABI_CWindows_CFoundation_CIUriRuntimeClass
#define IUriRuntimeClassVtbl __x_ABI_CWindows_CFoundation_CIUriRuntimeClassVtbl
#define IUriRuntimeClass __x_ABI_CWindows_CFoundation_CIUriRuntimeClass
#define IUriRuntimeClass_QueryInterface __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_QueryInterface
#define IUriRuntimeClass_AddRef __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_AddRef
#define IUriRuntimeClass_Release __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_Release
#define IUriRuntimeClass_GetIids __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_GetIids
#define IUriRuntimeClass_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_GetRuntimeClassName
#define IUriRuntimeClass_GetTrustLevel __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_GetTrustLevel
#define IUriRuntimeClass_get_AbsoluteUri __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_AbsoluteUri
#define IUriRuntimeClass_get_DisplayUri __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_DisplayUri
#define IUriRuntimeClass_get_Domain __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Domain
#define IUriRuntimeClass_get_Extension __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Extension
#define IUriRuntimeClass_get_Fragment __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Fragment
#define IUriRuntimeClass_get_Host __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Host
#define IUriRuntimeClass_get_Password __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Password
#define IUriRuntimeClass_get_Path __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Path
#define IUriRuntimeClass_get_Query __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Query
#define IUriRuntimeClass_get_QueryParsed __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_QueryParsed
#define IUriRuntimeClass_get_RawUri __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_RawUri
#define IUriRuntimeClass_get_SchemeName __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_SchemeName
#define IUriRuntimeClass_get_UserName __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_UserName
#define IUriRuntimeClass_get_Port __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Port
#define IUriRuntimeClass_get_Suspicious __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_get_Suspicious
#define IUriRuntimeClass_Equals __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_Equals
#define IUriRuntimeClass_CombineUri __x_ABI_CWindows_CFoundation_CIUriRuntimeClass_CombineUri
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*****************************************************************************
 * IUriRuntimeClassFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory, 0x44a9796f, 0x723e, 0x4fdf, 0xa2,0x18, 0x03,0x3e,0x75,0xb0,0xc0,0x84);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("44a9796f-723e-4fdf-a218-033e75b0c084")
            IUriRuntimeClassFactory : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE CreateUri(
                    HSTRING uri,
                    ABI::Windows::Foundation::IUriRuntimeClass **instance) = 0;

                virtual HRESULT STDMETHODCALLTYPE CreateWithRelativeUri(
                    HSTRING base_uri,
                    HSTRING relative_uri,
                    ABI::Windows::Foundation::IUriRuntimeClass **instance) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory, 0x44a9796f, 0x723e, 0x4fdf, 0xa2,0x18, 0x03,0x3e,0x75,0xb0,0xc0,0x84)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUriRuntimeClassFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateUri)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory *This,
        HSTRING uri,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **instance);

    HRESULT (STDMETHODCALLTYPE *CreateWithRelativeUri)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory *This,
        HSTRING base_uri,
        HSTRING relative_uri,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **instance);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactoryVtbl;

interface __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUriRuntimeClassFactory methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_CreateUri(This,uri,instance) (This)->lpVtbl->CreateUri(This,uri,instance)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_CreateWithRelativeUri(This,base_uri,relative_uri,instance) (This)->lpVtbl->CreateWithRelativeUri(This,base_uri,relative_uri,instance)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_QueryInterface(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_AddRef(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_Release(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_GetIids(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUriRuntimeClassFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_CreateUri(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory* This,HSTRING uri,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **instance) {
    return This->lpVtbl->CreateUri(This,uri,instance);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_CreateWithRelativeUri(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory* This,HSTRING base_uri,HSTRING relative_uri,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **instance) {
    return This->lpVtbl->CreateWithRelativeUri(This,base_uri,relative_uri,instance);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IUriRuntimeClassFactory IID___x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory
#define IUriRuntimeClassFactoryVtbl __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactoryVtbl
#define IUriRuntimeClassFactory __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory
#define IUriRuntimeClassFactory_QueryInterface __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_QueryInterface
#define IUriRuntimeClassFactory_AddRef __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_AddRef
#define IUriRuntimeClassFactory_Release __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_Release
#define IUriRuntimeClassFactory_GetIids __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_GetIids
#define IUriRuntimeClassFactory_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_GetRuntimeClassName
#define IUriRuntimeClassFactory_GetTrustLevel __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_GetTrustLevel
#define IUriRuntimeClassFactory_CreateUri __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_CreateUri
#define IUriRuntimeClassFactory_CreateWithRelativeUri __x_ABI_CWindows_CFoundation_CIUriRuntimeClassFactory_CreateWithRelativeUri
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*****************************************************************************
 * IUriRuntimeClassWithAbsoluteCanonicalUri interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri, 0x758d9661, 0x221c, 0x480f, 0xa3,0x39, 0x50,0x65,0x66,0x73,0xf4,0x6f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("758d9661-221c-480f-a339-50656673f46f")
            IUriRuntimeClassWithAbsoluteCanonicalUri : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_AbsoluteCanonicalUri(
                    HSTRING *value) = 0;

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

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri, 0x758d9661, 0x221c, 0x480f, 0xa3,0x39, 0x50,0x65,0x66,0x73,0xf4,0x6f)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUriVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUriRuntimeClassWithAbsoluteCanonicalUri methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AbsoluteCanonicalUri)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_DisplayIri)(
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUriVtbl;

interface __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUriVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUriRuntimeClassWithAbsoluteCanonicalUri methods ***/
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_get_AbsoluteCanonicalUri(This,value) (This)->lpVtbl->get_AbsoluteCanonicalUri(This,value)
#define __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_get_DisplayIri(This,value) (This)->lpVtbl->get_DisplayIri(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_QueryInterface(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_AddRef(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_Release(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_GetIids(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUriRuntimeClassWithAbsoluteCanonicalUri methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_get_AbsoluteCanonicalUri(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri* This,HSTRING *value) {
    return This->lpVtbl->get_AbsoluteCanonicalUri(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_get_DisplayIri(__x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayIri(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IUriRuntimeClassWithAbsoluteCanonicalUri IID___x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri
#define IUriRuntimeClassWithAbsoluteCanonicalUriVtbl __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUriVtbl
#define IUriRuntimeClassWithAbsoluteCanonicalUri __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri
#define IUriRuntimeClassWithAbsoluteCanonicalUri_QueryInterface __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_QueryInterface
#define IUriRuntimeClassWithAbsoluteCanonicalUri_AddRef __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_AddRef
#define IUriRuntimeClassWithAbsoluteCanonicalUri_Release __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_Release
#define IUriRuntimeClassWithAbsoluteCanonicalUri_GetIids __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_GetIids
#define IUriRuntimeClassWithAbsoluteCanonicalUri_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_GetRuntimeClassName
#define IUriRuntimeClassWithAbsoluteCanonicalUri_GetTrustLevel __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_GetTrustLevel
#define IUriRuntimeClassWithAbsoluteCanonicalUri_get_AbsoluteCanonicalUri __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_get_AbsoluteCanonicalUri
#define IUriRuntimeClassWithAbsoluteCanonicalUri_get_DisplayIri __x_ABI_CWindows_CFoundation_CIUriRuntimeClassWithAbsoluteCanonicalUri_get_DisplayIri
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*****************************************************************************
 * IWwwFormUrlDecoderEntry interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry, 0x125e7431, 0xf678, 0x4e8e, 0xb6,0x70, 0x20,0xa9,0xb0,0x6c,0x51,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("125e7431-f678-4e8e-b670-20a9b06c512d")
            IWwwFormUrlDecoderEntry : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Name(
                    HSTRING *value) = 0;

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

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry, 0x125e7431, 0xf678, 0x4e8e, 0xb6,0x70, 0x20,0xa9,0xb0,0x6c,0x51,0x2d)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IWwwFormUrlDecoderEntry methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntryVtbl;

interface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IWwwFormUrlDecoderEntry methods ***/
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_QueryInterface(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_AddRef(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_Release(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_GetIids(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IWwwFormUrlDecoderEntry methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_get_Name(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_get_Value(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry* This,HSTRING *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IWwwFormUrlDecoderEntry IID___x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry
#define IWwwFormUrlDecoderEntryVtbl __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntryVtbl
#define IWwwFormUrlDecoderEntry __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry
#define IWwwFormUrlDecoderEntry_QueryInterface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_QueryInterface
#define IWwwFormUrlDecoderEntry_AddRef __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_AddRef
#define IWwwFormUrlDecoderEntry_Release __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_Release
#define IWwwFormUrlDecoderEntry_GetIids __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_GetIids
#define IWwwFormUrlDecoderEntry_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_GetRuntimeClassName
#define IWwwFormUrlDecoderEntry_GetTrustLevel __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_GetTrustLevel
#define IWwwFormUrlDecoderEntry_get_Name __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_get_Name
#define IWwwFormUrlDecoderEntry_get_Value __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*****************************************************************************
 * IWwwFormUrlDecoderRuntimeClass interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass, 0xd45a0451, 0xf225, 0x4542, 0x92,0x96, 0x0e,0x1d,0xf5,0xd2,0x54,0xdf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("d45a0451-f225-4542-9296-0e1df5d254df")
            IWwwFormUrlDecoderRuntimeClass : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetFirstValueByName(
                    HSTRING name,
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass, 0xd45a0451, 0xf225, 0x4542, 0x92,0x96, 0x0e,0x1d,0xf5,0xd2,0x54,0xdf)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IWwwFormUrlDecoderRuntimeClass methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFirstValueByName)(
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass *This,
        HSTRING name,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassVtbl;

interface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IWwwFormUrlDecoderRuntimeClass methods ***/
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetFirstValueByName(This,name,value) (This)->lpVtbl->GetFirstValueByName(This,name,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_QueryInterface(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_AddRef(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_Release(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetIids(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IWwwFormUrlDecoderRuntimeClass methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetFirstValueByName(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass* This,HSTRING name,HSTRING *value) {
    return This->lpVtbl->GetFirstValueByName(This,name,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IWwwFormUrlDecoderRuntimeClass IID___x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass
#define IWwwFormUrlDecoderRuntimeClassVtbl __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassVtbl
#define IWwwFormUrlDecoderRuntimeClass __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass
#define IWwwFormUrlDecoderRuntimeClass_QueryInterface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_QueryInterface
#define IWwwFormUrlDecoderRuntimeClass_AddRef __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_AddRef
#define IWwwFormUrlDecoderRuntimeClass_Release __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_Release
#define IWwwFormUrlDecoderRuntimeClass_GetIids __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetIids
#define IWwwFormUrlDecoderRuntimeClass_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetRuntimeClassName
#define IWwwFormUrlDecoderRuntimeClass_GetTrustLevel __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetTrustLevel
#define IWwwFormUrlDecoderRuntimeClass_GetFirstValueByName __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass_GetFirstValueByName
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*****************************************************************************
 * IWwwFormUrlDecoderRuntimeClassFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory, 0x5b8c6b3d, 0x24ae, 0x41b5, 0xa1,0xbf, 0xf0,0xc3,0xd5,0x44,0x84,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            MIDL_INTERFACE("5b8c6b3d-24ae-41b5-a1bf-f0c3d544845b")
            IWwwFormUrlDecoderRuntimeClassFactory : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE CreateWwwFormUrlDecoder(
                    HSTRING query,
                    ABI::Windows::Foundation::IWwwFormUrlDecoderRuntimeClass **instance) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory, 0x5b8c6b3d, 0x24ae, 0x41b5, 0xa1,0xbf, 0xf0,0xc3,0xd5,0x44,0x84,0x5b)
#endif
#else
typedef struct __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IWwwFormUrlDecoderRuntimeClassFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateWwwFormUrlDecoder)(
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory *This,
        HSTRING query,
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass **instance);

    END_INTERFACE
} __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactoryVtbl;

interface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory {
    CONST_VTBL __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IWwwFormUrlDecoderRuntimeClassFactory methods ***/
#define __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_CreateWwwFormUrlDecoder(This,query,instance) (This)->lpVtbl->CreateWwwFormUrlDecoder(This,query,instance)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_QueryInterface(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_AddRef(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_Release(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_GetIids(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_GetRuntimeClassName(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_GetTrustLevel(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IWwwFormUrlDecoderRuntimeClassFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_CreateWwwFormUrlDecoder(__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory* This,HSTRING query,__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClass **instance) {
    return This->lpVtbl->CreateWwwFormUrlDecoder(This,query,instance);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IWwwFormUrlDecoderRuntimeClassFactory IID___x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory
#define IWwwFormUrlDecoderRuntimeClassFactoryVtbl __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactoryVtbl
#define IWwwFormUrlDecoderRuntimeClassFactory __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory
#define IWwwFormUrlDecoderRuntimeClassFactory_QueryInterface __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_QueryInterface
#define IWwwFormUrlDecoderRuntimeClassFactory_AddRef __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_AddRef
#define IWwwFormUrlDecoderRuntimeClassFactory_Release __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_Release
#define IWwwFormUrlDecoderRuntimeClassFactory_GetIids __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_GetIids
#define IWwwFormUrlDecoderRuntimeClassFactory_GetRuntimeClassName __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_GetRuntimeClassName
#define IWwwFormUrlDecoderRuntimeClassFactory_GetTrustLevel __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_GetTrustLevel
#define IWwwFormUrlDecoderRuntimeClassFactory_CreateWwwFormUrlDecoder __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderRuntimeClassFactory_CreateWwwFormUrlDecoder
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

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

/*
 * Class Windows.Foundation.Deferral
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Foundation_Deferral_DEFINED
#define RUNTIMECLASS_Windows_Foundation_Deferral_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Foundation_Deferral[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','D','e','f','e','r','r','a','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_Deferral[] = L"Windows.Foundation.Deferral";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_Deferral[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','D','e','f','e','r','r','a','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_Foundation_Deferral_DEFINED */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Foundation.MemoryBuffer
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Foundation_MemoryBuffer_DEFINED
#define RUNTIMECLASS_Windows_Foundation_MemoryBuffer_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Foundation_MemoryBuffer[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','M','e','m','o','r','y','B','u','f','f','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_MemoryBuffer[] = L"Windows.Foundation.MemoryBuffer";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_MemoryBuffer[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','M','e','m','o','r','y','B','u','f','f','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Foundation_MemoryBuffer_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Foundation.PropertyValue
 */
#if WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Foundation_PropertyValue_DEFINED
#define RUNTIMECLASS_Windows_Foundation_PropertyValue_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Foundation_PropertyValue[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','P','r','o','p','e','r','t','y','V','a','l','u','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_PropertyValue[] = L"Windows.Foundation.PropertyValue";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_PropertyValue[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','P','r','o','p','e','r','t','y','V','a','l','u','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Foundation_PropertyValue_DEFINED */
#endif /* WINDOWS_FOUNDATION_FOUNDATIONCONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Foundation.Uri
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Foundation_Uri_DEFINED
#define RUNTIMECLASS_Windows_Foundation_Uri_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Foundation_Uri[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','U','r','i',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_Uri[] = L"Windows.Foundation.Uri";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_Uri[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','U','r','i',0};
#endif
#endif /* RUNTIMECLASS_Windows_Foundation_Uri_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Foundation.WwwFormUrlDecoder
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Foundation_WwwFormUrlDecoder_DEFINED
#define RUNTIMECLASS_Windows_Foundation_WwwFormUrlDecoder_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Foundation_WwwFormUrlDecoder[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','W','w','w','F','o','r','m','U','r','l','D','e','c','o','d','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_WwwFormUrlDecoder[] = L"Windows.Foundation.WwwFormUrlDecoder";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_WwwFormUrlDecoder[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','W','w','w','F','o','r','m','U','r','l','D','e','c','o','d','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Foundation_WwwFormUrlDecoder_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Foundation.WwwFormUrlDecoderEntry
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Foundation_WwwFormUrlDecoderEntry_DEFINED
#define RUNTIMECLASS_Windows_Foundation_WwwFormUrlDecoderEntry_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Foundation_WwwFormUrlDecoderEntry[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','W','w','w','F','o','r','m','U','r','l','D','e','c','o','d','e','r','E','n','t','r','y',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_WwwFormUrlDecoderEntry[] = L"Windows.Foundation.WwwFormUrlDecoderEntry";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Foundation_WwwFormUrlDecoderEntry[] = {'W','i','n','d','o','w','s','.','F','o','u','n','d','a','t','i','o','n','.','W','w','w','F','o','r','m','U','r','l','D','e','c','o','d','e','r','E','n','t','r','y',0};
#endif
#endif /* RUNTIMECLASS_Windows_Foundation_WwwFormUrlDecoderEntry_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IKeyValuePair<HSTRING,HSTRING > interface
 */
#ifndef ____FIKeyValuePair_2_HSTRING_HSTRING_INTERFACE_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIKeyValuePair_2_HSTRING_HSTRING, 0x60310303, 0x49c5, 0x52e6, 0xab,0xc6, 0xa9,0xb3,0x6e,0xcc,0xc7,0x16);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("60310303-49c5-52e6-abc6-a9b36eccc716")
                IKeyValuePair<HSTRING,HSTRING > : IKeyValuePair_impl<HSTRING, HSTRING >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIKeyValuePair_2_HSTRING_HSTRING, 0x60310303, 0x49c5, 0x52e6, 0xab,0xc6, 0xa9,0xb3,0x6e,0xcc,0xc7,0x16)
#endif
#else
typedef struct __FIKeyValuePair_2_HSTRING_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IKeyValuePair<HSTRING,HSTRING > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Key)(
        __FIKeyValuePair_2_HSTRING_HSTRING *This,
        HSTRING *key);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIKeyValuePair_2_HSTRING_HSTRING *This,
        HSTRING *value);

    END_INTERFACE
} __FIKeyValuePair_2_HSTRING_HSTRINGVtbl;

interface __FIKeyValuePair_2_HSTRING_HSTRING {
    CONST_VTBL __FIKeyValuePair_2_HSTRING_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIKeyValuePair_2_HSTRING_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIKeyValuePair_2_HSTRING_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIKeyValuePair_2_HSTRING_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIKeyValuePair_2_HSTRING_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIKeyValuePair_2_HSTRING_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIKeyValuePair_2_HSTRING_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKeyValuePair<HSTRING,HSTRING > methods ***/
#define __FIKeyValuePair_2_HSTRING_HSTRING_get_Key(This,key) (This)->lpVtbl->get_Key(This,key)
#define __FIKeyValuePair_2_HSTRING_HSTRING_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_HSTRING_QueryInterface(__FIKeyValuePair_2_HSTRING_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIKeyValuePair_2_HSTRING_HSTRING_AddRef(__FIKeyValuePair_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIKeyValuePair_2_HSTRING_HSTRING_Release(__FIKeyValuePair_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_HSTRING_GetIids(__FIKeyValuePair_2_HSTRING_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_HSTRING_GetRuntimeClassName(__FIKeyValuePair_2_HSTRING_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_HSTRING_GetTrustLevel(__FIKeyValuePair_2_HSTRING_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKeyValuePair<HSTRING,HSTRING > methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_HSTRING_get_Key(__FIKeyValuePair_2_HSTRING_HSTRING* This,HSTRING *key) {
    return This->lpVtbl->get_Key(This,key);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_HSTRING_get_Value(__FIKeyValuePair_2_HSTRING_HSTRING* This,HSTRING *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IKeyValuePair_HSTRING_HSTRING IID___FIKeyValuePair_2_HSTRING_HSTRING
#define IKeyValuePair_HSTRING_HSTRINGVtbl __FIKeyValuePair_2_HSTRING_HSTRINGVtbl
#define IKeyValuePair_HSTRING_HSTRING __FIKeyValuePair_2_HSTRING_HSTRING
#define IKeyValuePair_HSTRING_HSTRING_QueryInterface __FIKeyValuePair_2_HSTRING_HSTRING_QueryInterface
#define IKeyValuePair_HSTRING_HSTRING_AddRef __FIKeyValuePair_2_HSTRING_HSTRING_AddRef
#define IKeyValuePair_HSTRING_HSTRING_Release __FIKeyValuePair_2_HSTRING_HSTRING_Release
#define IKeyValuePair_HSTRING_HSTRING_GetIids __FIKeyValuePair_2_HSTRING_HSTRING_GetIids
#define IKeyValuePair_HSTRING_HSTRING_GetRuntimeClassName __FIKeyValuePair_2_HSTRING_HSTRING_GetRuntimeClassName
#define IKeyValuePair_HSTRING_HSTRING_GetTrustLevel __FIKeyValuePair_2_HSTRING_HSTRING_GetTrustLevel
#define IKeyValuePair_HSTRING_HSTRING_get_Key __FIKeyValuePair_2_HSTRING_HSTRING_get_Key
#define IKeyValuePair_HSTRING_HSTRING_get_Value __FIKeyValuePair_2_HSTRING_HSTRING_get_Value
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIKeyValuePair_2_HSTRING_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IKeyValuePair<HSTRING,IInspectable* > interface
 */
#ifndef ____FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIKeyValuePair_2_HSTRING_IInspectable, 0x09335560, 0x6c6b, 0x5a26, 0x93,0x48, 0x97,0xb7,0x81,0x13,0x2b,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("09335560-6c6b-5a26-9348-97b781132b20")
                IKeyValuePair<HSTRING,IInspectable* > : IKeyValuePair_impl<HSTRING, IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIKeyValuePair_2_HSTRING_IInspectable, 0x09335560, 0x6c6b, 0x5a26, 0x93,0x48, 0x97,0xb7,0x81,0x13,0x2b,0x20)
#endif
#else
typedef struct __FIKeyValuePair_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IKeyValuePair<HSTRING,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Key)(
        __FIKeyValuePair_2_HSTRING_IInspectable *This,
        HSTRING *key);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIKeyValuePair_2_HSTRING_IInspectable *This,
        IInspectable **value);

    END_INTERFACE
} __FIKeyValuePair_2_HSTRING_IInspectableVtbl;

interface __FIKeyValuePair_2_HSTRING_IInspectable {
    CONST_VTBL __FIKeyValuePair_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIKeyValuePair_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIKeyValuePair_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIKeyValuePair_2_HSTRING_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKeyValuePair<HSTRING,IInspectable* > methods ***/
#define __FIKeyValuePair_2_HSTRING_IInspectable_get_Key(This,key) (This)->lpVtbl->get_Key(This,key)
#define __FIKeyValuePair_2_HSTRING_IInspectable_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface(__FIKeyValuePair_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIKeyValuePair_2_HSTRING_IInspectable_AddRef(__FIKeyValuePair_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIKeyValuePair_2_HSTRING_IInspectable_Release(__FIKeyValuePair_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_GetIids(__FIKeyValuePair_2_HSTRING_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName(__FIKeyValuePair_2_HSTRING_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel(__FIKeyValuePair_2_HSTRING_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKeyValuePair<HSTRING,IInspectable* > methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_get_Key(__FIKeyValuePair_2_HSTRING_IInspectable* This,HSTRING *key) {
    return This->lpVtbl->get_Key(This,key);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_IInspectable_get_Value(__FIKeyValuePair_2_HSTRING_IInspectable* This,IInspectable **value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IKeyValuePair_HSTRING_IInspectable IID___FIKeyValuePair_2_HSTRING_IInspectable
#define IKeyValuePair_HSTRING_IInspectableVtbl __FIKeyValuePair_2_HSTRING_IInspectableVtbl
#define IKeyValuePair_HSTRING_IInspectable __FIKeyValuePair_2_HSTRING_IInspectable
#define IKeyValuePair_HSTRING_IInspectable_QueryInterface __FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface
#define IKeyValuePair_HSTRING_IInspectable_AddRef __FIKeyValuePair_2_HSTRING_IInspectable_AddRef
#define IKeyValuePair_HSTRING_IInspectable_Release __FIKeyValuePair_2_HSTRING_IInspectable_Release
#define IKeyValuePair_HSTRING_IInspectable_GetIids __FIKeyValuePair_2_HSTRING_IInspectable_GetIids
#define IKeyValuePair_HSTRING_IInspectable_GetRuntimeClassName __FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName
#define IKeyValuePair_HSTRING_IInspectable_GetTrustLevel __FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel
#define IKeyValuePair_HSTRING_IInspectable_get_Key __FIKeyValuePair_2_HSTRING_IInspectable_get_Key
#define IKeyValuePair_HSTRING_IInspectable_get_Value __FIKeyValuePair_2_HSTRING_IInspectable_get_Value
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > interface
 */
#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_INTERFACE_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING, 0xe9bdaaf0, 0xcbf6, 0x5c72, 0xbe,0x90, 0x29,0xcb,0xf3,0xa1,0x31,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("e9bdaaf0-cbf6-5c72-be90-29cbf3a1319b")
                IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > : IIterable_impl<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING, 0xe9bdaaf0, 0xcbf6, 0x5c72, 0xbe,0x90, 0x29,0xcb,0xf3,0xa1,0x31,0x9b)
#endif
#else
typedef struct __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING *This,
        __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING **value);

    END_INTERFACE
} __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRINGVtbl;

interface __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING {
    CONST_VTBL __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_QueryInterface(__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_AddRef(__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_Release(__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_GetIids(__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_GetRuntimeClassName(__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_GetTrustLevel(__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_First(__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING* This,__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_IKeyValuePair_HSTRING_HSTRING IID___FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING
#define IIterable_IKeyValuePair_HSTRING_HSTRINGVtbl __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRINGVtbl
#define IIterable_IKeyValuePair_HSTRING_HSTRING __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING
#define IIterable_IKeyValuePair_HSTRING_HSTRING_QueryInterface __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_QueryInterface
#define IIterable_IKeyValuePair_HSTRING_HSTRING_AddRef __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_AddRef
#define IIterable_IKeyValuePair_HSTRING_HSTRING_Release __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_Release
#define IIterable_IKeyValuePair_HSTRING_HSTRING_GetIids __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_GetIids
#define IIterable_IKeyValuePair_HSTRING_HSTRING_GetRuntimeClassName __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_GetRuntimeClassName
#define IIterable_IKeyValuePair_HSTRING_HSTRING_GetTrustLevel __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_GetTrustLevel
#define IIterable_IKeyValuePair_HSTRING_HSTRING_First __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > interface
 */
#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable, 0xfe2f3d47, 0x5d47, 0x5499, 0x83,0x74, 0x43,0x0c,0x7c,0xda,0x02,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("fe2f3d47-5d47-5499-8374-430c7cda0204")
                IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > : IIterable_impl<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable, 0xfe2f3d47, 0x5d47, 0x5499, 0x83,0x74, 0x43,0x0c,0x7c,0xda,0x02,0x04)
#endif
#else
typedef struct __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable *This,
        __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable **value);

    END_INTERFACE
} __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl;

interface __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable {
    CONST_VTBL __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_AddRef(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_Release(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetIids(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_First(__FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable* This,__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_IKeyValuePair_HSTRING_IInspectable IID___FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable
#define IIterable_IKeyValuePair_HSTRING_IInspectableVtbl __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl
#define IIterable_IKeyValuePair_HSTRING_IInspectable __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable
#define IIterable_IKeyValuePair_HSTRING_IInspectable_QueryInterface __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface
#define IIterable_IKeyValuePair_HSTRING_IInspectable_AddRef __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_AddRef
#define IIterable_IKeyValuePair_HSTRING_IInspectable_Release __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_Release
#define IIterable_IKeyValuePair_HSTRING_IInspectable_GetIids __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetIids
#define IIterable_IKeyValuePair_HSTRING_IInspectable_GetRuntimeClassName __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName
#define IIterable_IKeyValuePair_HSTRING_IInspectable_GetTrustLevel __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel
#define IIterable_IKeyValuePair_HSTRING_IInspectable_First __FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1___FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > interface
 */
#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_INTERFACE_DEFINED__
#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING, 0x05eb86f1, 0x7140, 0x5517, 0xb8,0x8d, 0xcb,0xae,0xbe,0x57,0xe6,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("05eb86f1-7140-5517-b88d-cbaebe57e6b1")
                IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > : IIterator_impl<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING, 0x05eb86f1, 0x7140, 0x5517, 0xb8,0x8d, 0xcb,0xae,0xbe,0x57,0xe6,0xb1)
#endif
#else
typedef struct __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING *This,
        __FIKeyValuePair_2_HSTRING_HSTRING **value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING *This,
        UINT32 items_size,
        __FIKeyValuePair_2_HSTRING_HSTRING **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRINGVtbl;

interface __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING {
    CONST_VTBL __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > methods ***/
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_QueryInterface(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_AddRef(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_Release(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetIids(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetRuntimeClassName(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetTrustLevel(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > methods ***/
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_get_Current(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING* This,__FIKeyValuePair_2_HSTRING_HSTRING **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_get_HasCurrent(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_MoveNext(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetMany(__FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING* This,UINT32 items_size,__FIKeyValuePair_2_HSTRING_HSTRING **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_IKeyValuePair_HSTRING_HSTRING IID___FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING
#define IIterator_IKeyValuePair_HSTRING_HSTRINGVtbl __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRINGVtbl
#define IIterator_IKeyValuePair_HSTRING_HSTRING __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING
#define IIterator_IKeyValuePair_HSTRING_HSTRING_QueryInterface __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_QueryInterface
#define IIterator_IKeyValuePair_HSTRING_HSTRING_AddRef __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_AddRef
#define IIterator_IKeyValuePair_HSTRING_HSTRING_Release __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_Release
#define IIterator_IKeyValuePair_HSTRING_HSTRING_GetIids __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetIids
#define IIterator_IKeyValuePair_HSTRING_HSTRING_GetRuntimeClassName __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetRuntimeClassName
#define IIterator_IKeyValuePair_HSTRING_HSTRING_GetTrustLevel __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetTrustLevel
#define IIterator_IKeyValuePair_HSTRING_HSTRING_get_Current __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_get_Current
#define IIterator_IKeyValuePair_HSTRING_HSTRING_get_HasCurrent __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_get_HasCurrent
#define IIterator_IKeyValuePair_HSTRING_HSTRING_MoveNext __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_MoveNext
#define IIterator_IKeyValuePair_HSTRING_HSTRING_GetMany __FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1___FIKeyValuePair_2_HSTRING_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > interface
 */
#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable, 0x5db5fa32, 0x707c, 0x5849, 0xa0,0x6b, 0x91,0xc8,0xeb,0x9d,0x10,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("5db5fa32-707c-5849-a06b-91c8eb9d10e8")
                IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > : IIterator_impl<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable, 0x5db5fa32, 0x707c, 0x5849, 0xa0,0x6b, 0x91,0xc8,0xeb,0x9d,0x10,0xe8)
#endif
#else
typedef struct __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable *This,
        __FIKeyValuePair_2_HSTRING_IInspectable **value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable *This,
        UINT32 items_size,
        __FIKeyValuePair_2_HSTRING_IInspectable **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl;

interface __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable {
    CONST_VTBL __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > methods ***/
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_AddRef(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_Release(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetIids(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,IInspectable* >* > methods ***/
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_get_Current(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable* This,__FIKeyValuePair_2_HSTRING_IInspectable **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_get_HasCurrent(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_MoveNext(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetMany(__FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable* This,UINT32 items_size,__FIKeyValuePair_2_HSTRING_IInspectable **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_IKeyValuePair_HSTRING_IInspectable IID___FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable
#define IIterator_IKeyValuePair_HSTRING_IInspectableVtbl __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectableVtbl
#define IIterator_IKeyValuePair_HSTRING_IInspectable __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable
#define IIterator_IKeyValuePair_HSTRING_IInspectable_QueryInterface __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_QueryInterface
#define IIterator_IKeyValuePair_HSTRING_IInspectable_AddRef __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_AddRef
#define IIterator_IKeyValuePair_HSTRING_IInspectable_Release __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_Release
#define IIterator_IKeyValuePair_HSTRING_IInspectable_GetIids __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetIids
#define IIterator_IKeyValuePair_HSTRING_IInspectable_GetRuntimeClassName __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetRuntimeClassName
#define IIterator_IKeyValuePair_HSTRING_IInspectable_GetTrustLevel __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetTrustLevel
#define IIterator_IKeyValuePair_HSTRING_IInspectable_get_Current __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_get_Current
#define IIterator_IKeyValuePair_HSTRING_IInspectable_get_HasCurrent __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_get_HasCurrent
#define IIterator_IKeyValuePair_HSTRING_IInspectable_MoveNext __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_MoveNext
#define IIterator_IKeyValuePair_HSTRING_IInspectable_GetMany __FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1___FIKeyValuePair_2_HSTRING_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMapChangedEventArgs<HSTRING > interface
 */
#ifndef ____FIMapChangedEventArgs_1_HSTRING_INTERFACE_DEFINED__
#define ____FIMapChangedEventArgs_1_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMapChangedEventArgs_1_HSTRING, 0x60141efb, 0xf2f9, 0x5377, 0x96,0xfd, 0xf8,0xc6,0x0d,0x95,0x58,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("60141efb-f2f9-5377-96fd-f8c60d9558b5")
                IMapChangedEventArgs<HSTRING > : IMapChangedEventArgs_impl<HSTRING >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMapChangedEventArgs_1_HSTRING, 0x60141efb, 0xf2f9, 0x5377, 0x96,0xfd, 0xf8,0xc6,0x0d,0x95,0x58,0xb5)
#endif
#else
typedef struct __FIMapChangedEventArgs_1_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMapChangedEventArgs<HSTRING > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CollectionChanged)(
        __FIMapChangedEventArgs_1_HSTRING *This,
        __x_ABI_CWindows_CFoundation_CCollections_CCollectionChange *value);

    HRESULT (STDMETHODCALLTYPE *get_Key)(
        __FIMapChangedEventArgs_1_HSTRING *This,
        HSTRING *key);

    END_INTERFACE
} __FIMapChangedEventArgs_1_HSTRINGVtbl;

interface __FIMapChangedEventArgs_1_HSTRING {
    CONST_VTBL __FIMapChangedEventArgs_1_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMapChangedEventArgs_1_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMapChangedEventArgs_1_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMapChangedEventArgs_1_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMapChangedEventArgs_1_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMapChangedEventArgs_1_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMapChangedEventArgs_1_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMapChangedEventArgs<HSTRING > methods ***/
#define __FIMapChangedEventArgs_1_HSTRING_get_CollectionChanged(This,value) (This)->lpVtbl->get_CollectionChanged(This,value)
#define __FIMapChangedEventArgs_1_HSTRING_get_Key(This,key) (This)->lpVtbl->get_Key(This,key)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMapChangedEventArgs_1_HSTRING_QueryInterface(__FIMapChangedEventArgs_1_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMapChangedEventArgs_1_HSTRING_AddRef(__FIMapChangedEventArgs_1_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMapChangedEventArgs_1_HSTRING_Release(__FIMapChangedEventArgs_1_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMapChangedEventArgs_1_HSTRING_GetIids(__FIMapChangedEventArgs_1_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMapChangedEventArgs_1_HSTRING_GetRuntimeClassName(__FIMapChangedEventArgs_1_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMapChangedEventArgs_1_HSTRING_GetTrustLevel(__FIMapChangedEventArgs_1_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMapChangedEventArgs<HSTRING > methods ***/
static inline HRESULT __FIMapChangedEventArgs_1_HSTRING_get_CollectionChanged(__FIMapChangedEventArgs_1_HSTRING* This,__x_ABI_CWindows_CFoundation_CCollections_CCollectionChange *value) {
    return This->lpVtbl->get_CollectionChanged(This,value);
}
static inline HRESULT __FIMapChangedEventArgs_1_HSTRING_get_Key(__FIMapChangedEventArgs_1_HSTRING* This,HSTRING *key) {
    return This->lpVtbl->get_Key(This,key);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMapChangedEventArgs_HSTRING IID___FIMapChangedEventArgs_1_HSTRING
#define IMapChangedEventArgs_HSTRINGVtbl __FIMapChangedEventArgs_1_HSTRINGVtbl
#define IMapChangedEventArgs_HSTRING __FIMapChangedEventArgs_1_HSTRING
#define IMapChangedEventArgs_HSTRING_QueryInterface __FIMapChangedEventArgs_1_HSTRING_QueryInterface
#define IMapChangedEventArgs_HSTRING_AddRef __FIMapChangedEventArgs_1_HSTRING_AddRef
#define IMapChangedEventArgs_HSTRING_Release __FIMapChangedEventArgs_1_HSTRING_Release
#define IMapChangedEventArgs_HSTRING_GetIids __FIMapChangedEventArgs_1_HSTRING_GetIids
#define IMapChangedEventArgs_HSTRING_GetRuntimeClassName __FIMapChangedEventArgs_1_HSTRING_GetRuntimeClassName
#define IMapChangedEventArgs_HSTRING_GetTrustLevel __FIMapChangedEventArgs_1_HSTRING_GetTrustLevel
#define IMapChangedEventArgs_HSTRING_get_CollectionChanged __FIMapChangedEventArgs_1_HSTRING_get_CollectionChanged
#define IMapChangedEventArgs_HSTRING_get_Key __FIMapChangedEventArgs_1_HSTRING_get_Key
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMapChangedEventArgs_1_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMapChangedEventHandler<HSTRING,IInspectable* > interface
 */
#ifndef ____FIMapChangedEventHandler_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIMapChangedEventHandler_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMapChangedEventHandler_2_HSTRING_IInspectable, 0x24f981e5, 0xddca, 0x538d, 0xaa,0xda, 0xa5,0x99,0x06,0x08,0x4c,0xf1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("24f981e5-ddca-538d-aada-a59906084cf1")
                IMapChangedEventHandler<HSTRING,IInspectable* > : IMapChangedEventHandler_impl<HSTRING, IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMapChangedEventHandler_2_HSTRING_IInspectable, 0x24f981e5, 0xddca, 0x538d, 0xaa,0xda, 0xa5,0x99,0x06,0x08,0x4c,0xf1)
#endif
#else
typedef struct __FIMapChangedEventHandler_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMapChangedEventHandler<HSTRING,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIMapChangedEventHandler_2_HSTRING_IInspectable *This,
        __FIObservableMap_2_HSTRING_IInspectable *sender,
        __FIMapChangedEventArgs_1_HSTRING *args);

    END_INTERFACE
} __FIMapChangedEventHandler_2_HSTRING_IInspectableVtbl;

interface __FIMapChangedEventHandler_2_HSTRING_IInspectable {
    CONST_VTBL __FIMapChangedEventHandler_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMapChangedEventHandler_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMapChangedEventHandler_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMapChangedEventHandler_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IMapChangedEventHandler<HSTRING,IInspectable* > methods ***/
#define __FIMapChangedEventHandler_2_HSTRING_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMapChangedEventHandler_2_HSTRING_IInspectable_QueryInterface(__FIMapChangedEventHandler_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMapChangedEventHandler_2_HSTRING_IInspectable_AddRef(__FIMapChangedEventHandler_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMapChangedEventHandler_2_HSTRING_IInspectable_Release(__FIMapChangedEventHandler_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IMapChangedEventHandler<HSTRING,IInspectable* > methods ***/
static inline HRESULT __FIMapChangedEventHandler_2_HSTRING_IInspectable_Invoke(__FIMapChangedEventHandler_2_HSTRING_IInspectable* This,__FIObservableMap_2_HSTRING_IInspectable *sender,__FIMapChangedEventArgs_1_HSTRING *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMapChangedEventHandler_HSTRING_IInspectable IID___FIMapChangedEventHandler_2_HSTRING_IInspectable
#define IMapChangedEventHandler_HSTRING_IInspectableVtbl __FIMapChangedEventHandler_2_HSTRING_IInspectableVtbl
#define IMapChangedEventHandler_HSTRING_IInspectable __FIMapChangedEventHandler_2_HSTRING_IInspectable
#define IMapChangedEventHandler_HSTRING_IInspectable_QueryInterface __FIMapChangedEventHandler_2_HSTRING_IInspectable_QueryInterface
#define IMapChangedEventHandler_HSTRING_IInspectable_AddRef __FIMapChangedEventHandler_2_HSTRING_IInspectable_AddRef
#define IMapChangedEventHandler_HSTRING_IInspectable_Release __FIMapChangedEventHandler_2_HSTRING_IInspectable_Release
#define IMapChangedEventHandler_HSTRING_IInspectable_Invoke __FIMapChangedEventHandler_2_HSTRING_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMapChangedEventHandler_2_HSTRING_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMap<HSTRING,HSTRING > interface
 */
#ifndef ____FIMap_2_HSTRING_HSTRING_INTERFACE_DEFINED__
#define ____FIMap_2_HSTRING_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMap_2_HSTRING_HSTRING, 0xf6d1f700, 0x49c2, 0x52ae, 0x81,0x54, 0x82,0x6f,0x99,0x08,0x77,0x3c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("f6d1f700-49c2-52ae-8154-826f9908773c")
                IMap<HSTRING,HSTRING > : IMap_impl<HSTRING, HSTRING >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMap_2_HSTRING_HSTRING, 0xf6d1f700, 0x49c2, 0x52ae, 0x81,0x54, 0x82,0x6f,0x99,0x08,0x77,0x3c)
#endif
#else
typedef struct __FIMap_2_HSTRING_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMap<HSTRING,HSTRING > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMap_2_HSTRING_HSTRING *This,
        HSTRING key,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMap_2_HSTRING_HSTRING *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMap_2_HSTRING_HSTRING *This,
        HSTRING key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIMap_2_HSTRING_HSTRING *This,
        __FIMapView_2_HSTRING_HSTRING **view);

    HRESULT (STDMETHODCALLTYPE *Insert)(
        __FIMap_2_HSTRING_HSTRING *This,
        HSTRING key,
        HSTRING value,
        boolean *replaced);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        __FIMap_2_HSTRING_HSTRING *This,
        HSTRING key);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIMap_2_HSTRING_HSTRING *This);

    END_INTERFACE
} __FIMap_2_HSTRING_HSTRINGVtbl;

interface __FIMap_2_HSTRING_HSTRING {
    CONST_VTBL __FIMap_2_HSTRING_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMap_2_HSTRING_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMap_2_HSTRING_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMap_2_HSTRING_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMap_2_HSTRING_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMap_2_HSTRING_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMap_2_HSTRING_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMap<HSTRING,HSTRING > methods ***/
#define __FIMap_2_HSTRING_HSTRING_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMap_2_HSTRING_HSTRING_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMap_2_HSTRING_HSTRING_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMap_2_HSTRING_HSTRING_GetView(This,view) (This)->lpVtbl->GetView(This,view)
#define __FIMap_2_HSTRING_HSTRING_Insert(This,key,value,replaced) (This)->lpVtbl->Insert(This,key,value,replaced)
#define __FIMap_2_HSTRING_HSTRING_Remove(This,key) (This)->lpVtbl->Remove(This,key)
#define __FIMap_2_HSTRING_HSTRING_Clear(This) (This)->lpVtbl->Clear(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMap_2_HSTRING_HSTRING_QueryInterface(__FIMap_2_HSTRING_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMap_2_HSTRING_HSTRING_AddRef(__FIMap_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMap_2_HSTRING_HSTRING_Release(__FIMap_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMap_2_HSTRING_HSTRING_GetIids(__FIMap_2_HSTRING_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMap_2_HSTRING_HSTRING_GetRuntimeClassName(__FIMap_2_HSTRING_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMap_2_HSTRING_HSTRING_GetTrustLevel(__FIMap_2_HSTRING_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMap<HSTRING,HSTRING > methods ***/
static inline HRESULT __FIMap_2_HSTRING_HSTRING_Lookup(__FIMap_2_HSTRING_HSTRING* This,HSTRING key,HSTRING *value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMap_2_HSTRING_HSTRING_get_Size(__FIMap_2_HSTRING_HSTRING* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMap_2_HSTRING_HSTRING_HasKey(__FIMap_2_HSTRING_HSTRING* This,HSTRING key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMap_2_HSTRING_HSTRING_GetView(__FIMap_2_HSTRING_HSTRING* This,__FIMapView_2_HSTRING_HSTRING **view) {
    return This->lpVtbl->GetView(This,view);
}
static inline HRESULT __FIMap_2_HSTRING_HSTRING_Insert(__FIMap_2_HSTRING_HSTRING* This,HSTRING key,HSTRING value,boolean *replaced) {
    return This->lpVtbl->Insert(This,key,value,replaced);
}
static inline HRESULT __FIMap_2_HSTRING_HSTRING_Remove(__FIMap_2_HSTRING_HSTRING* This,HSTRING key) {
    return This->lpVtbl->Remove(This,key);
}
static inline HRESULT __FIMap_2_HSTRING_HSTRING_Clear(__FIMap_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->Clear(This);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMap_HSTRING_HSTRING IID___FIMap_2_HSTRING_HSTRING
#define IMap_HSTRING_HSTRINGVtbl __FIMap_2_HSTRING_HSTRINGVtbl
#define IMap_HSTRING_HSTRING __FIMap_2_HSTRING_HSTRING
#define IMap_HSTRING_HSTRING_QueryInterface __FIMap_2_HSTRING_HSTRING_QueryInterface
#define IMap_HSTRING_HSTRING_AddRef __FIMap_2_HSTRING_HSTRING_AddRef
#define IMap_HSTRING_HSTRING_Release __FIMap_2_HSTRING_HSTRING_Release
#define IMap_HSTRING_HSTRING_GetIids __FIMap_2_HSTRING_HSTRING_GetIids
#define IMap_HSTRING_HSTRING_GetRuntimeClassName __FIMap_2_HSTRING_HSTRING_GetRuntimeClassName
#define IMap_HSTRING_HSTRING_GetTrustLevel __FIMap_2_HSTRING_HSTRING_GetTrustLevel
#define IMap_HSTRING_HSTRING_Lookup __FIMap_2_HSTRING_HSTRING_Lookup
#define IMap_HSTRING_HSTRING_get_Size __FIMap_2_HSTRING_HSTRING_get_Size
#define IMap_HSTRING_HSTRING_HasKey __FIMap_2_HSTRING_HSTRING_HasKey
#define IMap_HSTRING_HSTRING_GetView __FIMap_2_HSTRING_HSTRING_GetView
#define IMap_HSTRING_HSTRING_Insert __FIMap_2_HSTRING_HSTRING_Insert
#define IMap_HSTRING_HSTRING_Remove __FIMap_2_HSTRING_HSTRING_Remove
#define IMap_HSTRING_HSTRING_Clear __FIMap_2_HSTRING_HSTRING_Clear
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMap_2_HSTRING_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMap<HSTRING,IInspectable* > interface
 */
#ifndef ____FIMap_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIMap_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMap_2_HSTRING_IInspectable, 0x1b0d3570, 0x0877, 0x5ec2, 0x8a,0x2c, 0x3b,0x95,0x39,0x50,0x6a,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("1b0d3570-0877-5ec2-8a2c-3b9539506aca")
                IMap<HSTRING,IInspectable* > : IMap_impl<HSTRING, IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMap_2_HSTRING_IInspectable, 0x1b0d3570, 0x0877, 0x5ec2, 0x8a,0x2c, 0x3b,0x95,0x39,0x50,0x6a,0xca)
#endif
#else
typedef struct __FIMap_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMap<HSTRING,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMap_2_HSTRING_IInspectable *This,
        HSTRING key,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMap_2_HSTRING_IInspectable *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMap_2_HSTRING_IInspectable *This,
        HSTRING key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIMap_2_HSTRING_IInspectable *This,
        __FIMapView_2_HSTRING_IInspectable **view);

    HRESULT (STDMETHODCALLTYPE *Insert)(
        __FIMap_2_HSTRING_IInspectable *This,
        HSTRING key,
        IInspectable *value,
        boolean *replaced);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        __FIMap_2_HSTRING_IInspectable *This,
        HSTRING key);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIMap_2_HSTRING_IInspectable *This);

    END_INTERFACE
} __FIMap_2_HSTRING_IInspectableVtbl;

interface __FIMap_2_HSTRING_IInspectable {
    CONST_VTBL __FIMap_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMap_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMap_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMap_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMap_2_HSTRING_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMap_2_HSTRING_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMap_2_HSTRING_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMap<HSTRING,IInspectable* > methods ***/
#define __FIMap_2_HSTRING_IInspectable_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMap_2_HSTRING_IInspectable_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMap_2_HSTRING_IInspectable_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMap_2_HSTRING_IInspectable_GetView(This,view) (This)->lpVtbl->GetView(This,view)
#define __FIMap_2_HSTRING_IInspectable_Insert(This,key,value,replaced) (This)->lpVtbl->Insert(This,key,value,replaced)
#define __FIMap_2_HSTRING_IInspectable_Remove(This,key) (This)->lpVtbl->Remove(This,key)
#define __FIMap_2_HSTRING_IInspectable_Clear(This) (This)->lpVtbl->Clear(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMap_2_HSTRING_IInspectable_QueryInterface(__FIMap_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMap_2_HSTRING_IInspectable_AddRef(__FIMap_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMap_2_HSTRING_IInspectable_Release(__FIMap_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMap_2_HSTRING_IInspectable_GetIids(__FIMap_2_HSTRING_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_GetRuntimeClassName(__FIMap_2_HSTRING_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_GetTrustLevel(__FIMap_2_HSTRING_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMap<HSTRING,IInspectable* > methods ***/
static inline HRESULT __FIMap_2_HSTRING_IInspectable_Lookup(__FIMap_2_HSTRING_IInspectable* This,HSTRING key,IInspectable **value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_get_Size(__FIMap_2_HSTRING_IInspectable* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_HasKey(__FIMap_2_HSTRING_IInspectable* This,HSTRING key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_GetView(__FIMap_2_HSTRING_IInspectable* This,__FIMapView_2_HSTRING_IInspectable **view) {
    return This->lpVtbl->GetView(This,view);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_Insert(__FIMap_2_HSTRING_IInspectable* This,HSTRING key,IInspectable *value,boolean *replaced) {
    return This->lpVtbl->Insert(This,key,value,replaced);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_Remove(__FIMap_2_HSTRING_IInspectable* This,HSTRING key) {
    return This->lpVtbl->Remove(This,key);
}
static inline HRESULT __FIMap_2_HSTRING_IInspectable_Clear(__FIMap_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Clear(This);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMap_HSTRING_IInspectable IID___FIMap_2_HSTRING_IInspectable
#define IMap_HSTRING_IInspectableVtbl __FIMap_2_HSTRING_IInspectableVtbl
#define IMap_HSTRING_IInspectable __FIMap_2_HSTRING_IInspectable
#define IMap_HSTRING_IInspectable_QueryInterface __FIMap_2_HSTRING_IInspectable_QueryInterface
#define IMap_HSTRING_IInspectable_AddRef __FIMap_2_HSTRING_IInspectable_AddRef
#define IMap_HSTRING_IInspectable_Release __FIMap_2_HSTRING_IInspectable_Release
#define IMap_HSTRING_IInspectable_GetIids __FIMap_2_HSTRING_IInspectable_GetIids
#define IMap_HSTRING_IInspectable_GetRuntimeClassName __FIMap_2_HSTRING_IInspectable_GetRuntimeClassName
#define IMap_HSTRING_IInspectable_GetTrustLevel __FIMap_2_HSTRING_IInspectable_GetTrustLevel
#define IMap_HSTRING_IInspectable_Lookup __FIMap_2_HSTRING_IInspectable_Lookup
#define IMap_HSTRING_IInspectable_get_Size __FIMap_2_HSTRING_IInspectable_get_Size
#define IMap_HSTRING_IInspectable_HasKey __FIMap_2_HSTRING_IInspectable_HasKey
#define IMap_HSTRING_IInspectable_GetView __FIMap_2_HSTRING_IInspectable_GetView
#define IMap_HSTRING_IInspectable_Insert __FIMap_2_HSTRING_IInspectable_Insert
#define IMap_HSTRING_IInspectable_Remove __FIMap_2_HSTRING_IInspectable_Remove
#define IMap_HSTRING_IInspectable_Clear __FIMap_2_HSTRING_IInspectable_Clear
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMap_2_HSTRING_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMapView<HSTRING,HSTRING > interface
 */
#ifndef ____FIMapView_2_HSTRING_HSTRING_INTERFACE_DEFINED__
#define ____FIMapView_2_HSTRING_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMapView_2_HSTRING_HSTRING, 0xac7f26f2, 0xfeb7, 0x5b2a, 0x8a,0xc4, 0x34,0x5b,0xc6,0x2c,0xae,0xde);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("ac7f26f2-feb7-5b2a-8ac4-345bc62caede")
                IMapView<HSTRING,HSTRING > : IMapView_impl<HSTRING, HSTRING >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMapView_2_HSTRING_HSTRING, 0xac7f26f2, 0xfeb7, 0x5b2a, 0x8a,0xc4, 0x34,0x5b,0xc6,0x2c,0xae,0xde)
#endif
#else
typedef struct __FIMapView_2_HSTRING_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMapView<HSTRING,HSTRING > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMapView_2_HSTRING_HSTRING *This,
        HSTRING key,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMapView_2_HSTRING_HSTRING *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMapView_2_HSTRING_HSTRING *This,
        HSTRING key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *Split)(
        __FIMapView_2_HSTRING_HSTRING *This,
        __FIMapView_2_HSTRING_HSTRING **first,
        __FIMapView_2_HSTRING_HSTRING **second);

    END_INTERFACE
} __FIMapView_2_HSTRING_HSTRINGVtbl;

interface __FIMapView_2_HSTRING_HSTRING {
    CONST_VTBL __FIMapView_2_HSTRING_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMapView_2_HSTRING_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMapView_2_HSTRING_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMapView_2_HSTRING_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMapView_2_HSTRING_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMapView_2_HSTRING_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMapView_2_HSTRING_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMapView<HSTRING,HSTRING > methods ***/
#define __FIMapView_2_HSTRING_HSTRING_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMapView_2_HSTRING_HSTRING_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMapView_2_HSTRING_HSTRING_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMapView_2_HSTRING_HSTRING_Split(This,first,second) (This)->lpVtbl->Split(This,first,second)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMapView_2_HSTRING_HSTRING_QueryInterface(__FIMapView_2_HSTRING_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMapView_2_HSTRING_HSTRING_AddRef(__FIMapView_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMapView_2_HSTRING_HSTRING_Release(__FIMapView_2_HSTRING_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMapView_2_HSTRING_HSTRING_GetIids(__FIMapView_2_HSTRING_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMapView_2_HSTRING_HSTRING_GetRuntimeClassName(__FIMapView_2_HSTRING_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMapView_2_HSTRING_HSTRING_GetTrustLevel(__FIMapView_2_HSTRING_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMapView<HSTRING,HSTRING > methods ***/
static inline HRESULT __FIMapView_2_HSTRING_HSTRING_Lookup(__FIMapView_2_HSTRING_HSTRING* This,HSTRING key,HSTRING *value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMapView_2_HSTRING_HSTRING_get_Size(__FIMapView_2_HSTRING_HSTRING* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMapView_2_HSTRING_HSTRING_HasKey(__FIMapView_2_HSTRING_HSTRING* This,HSTRING key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMapView_2_HSTRING_HSTRING_Split(__FIMapView_2_HSTRING_HSTRING* This,__FIMapView_2_HSTRING_HSTRING **first,__FIMapView_2_HSTRING_HSTRING **second) {
    return This->lpVtbl->Split(This,first,second);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMapView_HSTRING_HSTRING IID___FIMapView_2_HSTRING_HSTRING
#define IMapView_HSTRING_HSTRINGVtbl __FIMapView_2_HSTRING_HSTRINGVtbl
#define IMapView_HSTRING_HSTRING __FIMapView_2_HSTRING_HSTRING
#define IMapView_HSTRING_HSTRING_QueryInterface __FIMapView_2_HSTRING_HSTRING_QueryInterface
#define IMapView_HSTRING_HSTRING_AddRef __FIMapView_2_HSTRING_HSTRING_AddRef
#define IMapView_HSTRING_HSTRING_Release __FIMapView_2_HSTRING_HSTRING_Release
#define IMapView_HSTRING_HSTRING_GetIids __FIMapView_2_HSTRING_HSTRING_GetIids
#define IMapView_HSTRING_HSTRING_GetRuntimeClassName __FIMapView_2_HSTRING_HSTRING_GetRuntimeClassName
#define IMapView_HSTRING_HSTRING_GetTrustLevel __FIMapView_2_HSTRING_HSTRING_GetTrustLevel
#define IMapView_HSTRING_HSTRING_Lookup __FIMapView_2_HSTRING_HSTRING_Lookup
#define IMapView_HSTRING_HSTRING_get_Size __FIMapView_2_HSTRING_HSTRING_get_Size
#define IMapView_HSTRING_HSTRING_HasKey __FIMapView_2_HSTRING_HSTRING_HasKey
#define IMapView_HSTRING_HSTRING_Split __FIMapView_2_HSTRING_HSTRING_Split
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMapView_2_HSTRING_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMapView<HSTRING,IInspectable* > interface
 */
#ifndef ____FIMapView_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIMapView_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMapView_2_HSTRING_IInspectable, 0xbb78502a, 0xf79d, 0x54fa, 0x92,0xc9, 0x90,0xc5,0x03,0x9f,0xdf,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("bb78502a-f79d-54fa-92c9-90c5039fdf7e")
                IMapView<HSTRING,IInspectable* > : IMapView_impl<HSTRING, IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMapView_2_HSTRING_IInspectable, 0xbb78502a, 0xf79d, 0x54fa, 0x92,0xc9, 0x90,0xc5,0x03,0x9f,0xdf,0x7e)
#endif
#else
typedef struct __FIMapView_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMapView<HSTRING,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMapView_2_HSTRING_IInspectable *This,
        HSTRING key,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMapView_2_HSTRING_IInspectable *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMapView_2_HSTRING_IInspectable *This,
        HSTRING key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *Split)(
        __FIMapView_2_HSTRING_IInspectable *This,
        __FIMapView_2_HSTRING_IInspectable **first,
        __FIMapView_2_HSTRING_IInspectable **second);

    END_INTERFACE
} __FIMapView_2_HSTRING_IInspectableVtbl;

interface __FIMapView_2_HSTRING_IInspectable {
    CONST_VTBL __FIMapView_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMapView_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMapView_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMapView_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMapView_2_HSTRING_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMapView_2_HSTRING_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMapView_2_HSTRING_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMapView<HSTRING,IInspectable* > methods ***/
#define __FIMapView_2_HSTRING_IInspectable_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMapView_2_HSTRING_IInspectable_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMapView_2_HSTRING_IInspectable_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMapView_2_HSTRING_IInspectable_Split(This,first,second) (This)->lpVtbl->Split(This,first,second)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_QueryInterface(__FIMapView_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMapView_2_HSTRING_IInspectable_AddRef(__FIMapView_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMapView_2_HSTRING_IInspectable_Release(__FIMapView_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_GetIids(__FIMapView_2_HSTRING_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_GetRuntimeClassName(__FIMapView_2_HSTRING_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_GetTrustLevel(__FIMapView_2_HSTRING_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMapView<HSTRING,IInspectable* > methods ***/
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_Lookup(__FIMapView_2_HSTRING_IInspectable* This,HSTRING key,IInspectable **value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_get_Size(__FIMapView_2_HSTRING_IInspectable* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_HasKey(__FIMapView_2_HSTRING_IInspectable* This,HSTRING key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMapView_2_HSTRING_IInspectable_Split(__FIMapView_2_HSTRING_IInspectable* This,__FIMapView_2_HSTRING_IInspectable **first,__FIMapView_2_HSTRING_IInspectable **second) {
    return This->lpVtbl->Split(This,first,second);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMapView_HSTRING_IInspectable IID___FIMapView_2_HSTRING_IInspectable
#define IMapView_HSTRING_IInspectableVtbl __FIMapView_2_HSTRING_IInspectableVtbl
#define IMapView_HSTRING_IInspectable __FIMapView_2_HSTRING_IInspectable
#define IMapView_HSTRING_IInspectable_QueryInterface __FIMapView_2_HSTRING_IInspectable_QueryInterface
#define IMapView_HSTRING_IInspectable_AddRef __FIMapView_2_HSTRING_IInspectable_AddRef
#define IMapView_HSTRING_IInspectable_Release __FIMapView_2_HSTRING_IInspectable_Release
#define IMapView_HSTRING_IInspectable_GetIids __FIMapView_2_HSTRING_IInspectable_GetIids
#define IMapView_HSTRING_IInspectable_GetRuntimeClassName __FIMapView_2_HSTRING_IInspectable_GetRuntimeClassName
#define IMapView_HSTRING_IInspectable_GetTrustLevel __FIMapView_2_HSTRING_IInspectable_GetTrustLevel
#define IMapView_HSTRING_IInspectable_Lookup __FIMapView_2_HSTRING_IInspectable_Lookup
#define IMapView_HSTRING_IInspectable_get_Size __FIMapView_2_HSTRING_IInspectable_get_Size
#define IMapView_HSTRING_IInspectable_HasKey __FIMapView_2_HSTRING_IInspectable_HasKey
#define IMapView_HSTRING_IInspectable_Split __FIMapView_2_HSTRING_IInspectable_Split
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMapView_2_HSTRING_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IObservableMap<HSTRING,IInspectable* > interface
 */
#ifndef ____FIObservableMap_2_HSTRING_IInspectable_INTERFACE_DEFINED__
#define ____FIObservableMap_2_HSTRING_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIObservableMap_2_HSTRING_IInspectable, 0x236aac9d, 0xfb12, 0x5c4d, 0xa4,0x1c, 0x9e,0x44,0x5f,0xb4,0xd7,0xec);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("236aac9d-fb12-5c4d-a41c-9e445fb4d7ec")
                IObservableMap<HSTRING,IInspectable* > : IObservableMap_impl<HSTRING, IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIObservableMap_2_HSTRING_IInspectable, 0x236aac9d, 0xfb12, 0x5c4d, 0xa4,0x1c, 0x9e,0x44,0x5f,0xb4,0xd7,0xec)
#endif
#else
typedef struct __FIObservableMap_2_HSTRING_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IObservableMap<HSTRING,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *add_MapChanged)(
        __FIObservableMap_2_HSTRING_IInspectable *This,
        __FIMapChangedEventHandler_2_HSTRING_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_MapChanged)(
        __FIObservableMap_2_HSTRING_IInspectable *This,
        EventRegistrationToken token);

    END_INTERFACE
} __FIObservableMap_2_HSTRING_IInspectableVtbl;

interface __FIObservableMap_2_HSTRING_IInspectable {
    CONST_VTBL __FIObservableMap_2_HSTRING_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIObservableMap_2_HSTRING_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIObservableMap_2_HSTRING_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIObservableMap_2_HSTRING_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIObservableMap_2_HSTRING_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIObservableMap_2_HSTRING_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIObservableMap_2_HSTRING_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IObservableMap<HSTRING,IInspectable* > methods ***/
#define __FIObservableMap_2_HSTRING_IInspectable_add_MapChanged(This,handler,token) (This)->lpVtbl->add_MapChanged(This,handler,token)
#define __FIObservableMap_2_HSTRING_IInspectable_remove_MapChanged(This,token) (This)->lpVtbl->remove_MapChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIObservableMap_2_HSTRING_IInspectable_QueryInterface(__FIObservableMap_2_HSTRING_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIObservableMap_2_HSTRING_IInspectable_AddRef(__FIObservableMap_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIObservableMap_2_HSTRING_IInspectable_Release(__FIObservableMap_2_HSTRING_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIObservableMap_2_HSTRING_IInspectable_GetIids(__FIObservableMap_2_HSTRING_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIObservableMap_2_HSTRING_IInspectable_GetRuntimeClassName(__FIObservableMap_2_HSTRING_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIObservableMap_2_HSTRING_IInspectable_GetTrustLevel(__FIObservableMap_2_HSTRING_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IObservableMap<HSTRING,IInspectable* > methods ***/
static inline HRESULT __FIObservableMap_2_HSTRING_IInspectable_add_MapChanged(__FIObservableMap_2_HSTRING_IInspectable* This,__FIMapChangedEventHandler_2_HSTRING_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_MapChanged(This,handler,token);
}
static inline HRESULT __FIObservableMap_2_HSTRING_IInspectable_remove_MapChanged(__FIObservableMap_2_HSTRING_IInspectable* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_MapChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IObservableMap_HSTRING_IInspectable IID___FIObservableMap_2_HSTRING_IInspectable
#define IObservableMap_HSTRING_IInspectableVtbl __FIObservableMap_2_HSTRING_IInspectableVtbl
#define IObservableMap_HSTRING_IInspectable __FIObservableMap_2_HSTRING_IInspectable
#define IObservableMap_HSTRING_IInspectable_QueryInterface __FIObservableMap_2_HSTRING_IInspectable_QueryInterface
#define IObservableMap_HSTRING_IInspectable_AddRef __FIObservableMap_2_HSTRING_IInspectable_AddRef
#define IObservableMap_HSTRING_IInspectable_Release __FIObservableMap_2_HSTRING_IInspectable_Release
#define IObservableMap_HSTRING_IInspectable_GetIids __FIObservableMap_2_HSTRING_IInspectable_GetIids
#define IObservableMap_HSTRING_IInspectable_GetRuntimeClassName __FIObservableMap_2_HSTRING_IInspectable_GetRuntimeClassName
#define IObservableMap_HSTRING_IInspectable_GetTrustLevel __FIObservableMap_2_HSTRING_IInspectable_GetTrustLevel
#define IObservableMap_HSTRING_IInspectable_add_MapChanged __FIObservableMap_2_HSTRING_IInspectable_add_MapChanged
#define IObservableMap_HSTRING_IInspectable_remove_MapChanged __FIObservableMap_2_HSTRING_IInspectable_remove_MapChanged
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIObservableMap_2_HSTRING_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<HSTRING > interface
 */
#ifndef ____FIIterable_1_HSTRING_INTERFACE_DEFINED__
#define ____FIIterable_1_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_HSTRING, 0xe2fcc7c1, 0x3bfc, 0x5a0b, 0xb2,0xb0, 0x72,0xe7,0x69,0xd1,0xcb,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("e2fcc7c1-3bfc-5a0b-b2b0-72e769d1cb7e")
                IIterable<HSTRING > : IIterable_impl<HSTRING >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_HSTRING, 0xe2fcc7c1, 0x3bfc, 0x5a0b, 0xb2,0xb0, 0x72,0xe7,0x69,0xd1,0xcb,0x7e)
#endif
#else
typedef struct __FIIterable_1_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<HSTRING > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_HSTRING *This,
        __FIIterator_1_HSTRING **value);

    END_INTERFACE
} __FIIterable_1_HSTRINGVtbl;

interface __FIIterable_1_HSTRING {
    CONST_VTBL __FIIterable_1_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<HSTRING > methods ***/
#define __FIIterable_1_HSTRING_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_HSTRING_QueryInterface(__FIIterable_1_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_HSTRING_AddRef(__FIIterable_1_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_HSTRING_Release(__FIIterable_1_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_HSTRING_GetIids(__FIIterable_1_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_HSTRING_GetRuntimeClassName(__FIIterable_1_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_HSTRING_GetTrustLevel(__FIIterable_1_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<HSTRING > methods ***/
static inline HRESULT __FIIterable_1_HSTRING_First(__FIIterable_1_HSTRING* This,__FIIterator_1_HSTRING **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_HSTRING IID___FIIterable_1_HSTRING
#define IIterable_HSTRINGVtbl __FIIterable_1_HSTRINGVtbl
#define IIterable_HSTRING __FIIterable_1_HSTRING
#define IIterable_HSTRING_QueryInterface __FIIterable_1_HSTRING_QueryInterface
#define IIterable_HSTRING_AddRef __FIIterable_1_HSTRING_AddRef
#define IIterable_HSTRING_Release __FIIterable_1_HSTRING_Release
#define IIterable_HSTRING_GetIids __FIIterable_1_HSTRING_GetIids
#define IIterable_HSTRING_GetRuntimeClassName __FIIterable_1_HSTRING_GetRuntimeClassName
#define IIterable_HSTRING_GetTrustLevel __FIIterable_1_HSTRING_GetTrustLevel
#define IIterable_HSTRING_First __FIIterable_1_HSTRING_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<IInspectable* > interface
 */
#ifndef ____FIIterable_1_IInspectable_INTERFACE_DEFINED__
#define ____FIIterable_1_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_IInspectable, 0x092b849b, 0x60b1, 0x52be, 0xa4,0x4a, 0x6f,0xe8,0xe9,0x33,0xcb,0xe4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("092b849b-60b1-52be-a44a-6fe8e933cbe4")
                IIterable<IInspectable* > : IIterable_impl<IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_IInspectable, 0x092b849b, 0x60b1, 0x52be, 0xa4,0x4a, 0x6f,0xe8,0xe9,0x33,0xcb,0xe4)
#endif
#else
typedef struct __FIIterable_1_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_IInspectable *This,
        __FIIterator_1_IInspectable **value);

    END_INTERFACE
} __FIIterable_1_IInspectableVtbl;

interface __FIIterable_1_IInspectable {
    CONST_VTBL __FIIterable_1_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<IInspectable* > methods ***/
#define __FIIterable_1_IInspectable_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_IInspectable_QueryInterface(__FIIterable_1_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_IInspectable_AddRef(__FIIterable_1_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_IInspectable_Release(__FIIterable_1_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_IInspectable_GetIids(__FIIterable_1_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_IInspectable_GetRuntimeClassName(__FIIterable_1_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_IInspectable_GetTrustLevel(__FIIterable_1_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<IInspectable* > methods ***/
static inline HRESULT __FIIterable_1_IInspectable_First(__FIIterable_1_IInspectable* This,__FIIterator_1_IInspectable **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_IInspectable IID___FIIterable_1_IInspectable
#define IIterable_IInspectableVtbl __FIIterable_1_IInspectableVtbl
#define IIterable_IInspectable __FIIterable_1_IInspectable
#define IIterable_IInspectable_QueryInterface __FIIterable_1_IInspectable_QueryInterface
#define IIterable_IInspectable_AddRef __FIIterable_1_IInspectable_AddRef
#define IIterable_IInspectable_Release __FIIterable_1_IInspectable_Release
#define IIterable_IInspectable_GetIids __FIIterable_1_IInspectable_GetIids
#define IIterable_IInspectable_GetRuntimeClassName __FIIterable_1_IInspectable_GetRuntimeClassName
#define IIterable_IInspectable_GetTrustLevel __FIIterable_1_IInspectable_GetTrustLevel
#define IIterable_IInspectable_First __FIIterable_1_IInspectable_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > interface
 */
#ifndef ____FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry, 0x876be83b, 0x7218, 0x5bfb, 0xa1,0x69, 0x83,0x15,0x2e,0xf7,0xe1,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("876be83b-7218-5bfb-a169-83152ef7e146")
                IIterable<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > : IIterable_impl<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry, 0x876be83b, 0x7218, 0x5bfb, 0xa1,0x69, 0x83,0x15,0x2e,0xf7,0xe1,0x46)
#endif
#else
typedef struct __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry *This,
        __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry **value);

    END_INTERFACE
} __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl;

interface __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry {
    CONST_VTBL __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > methods ***/
#define __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_QueryInterface(__FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_AddRef(__FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_Release(__FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetIids(__FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetRuntimeClassName(__FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetTrustLevel(__FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_First(__FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_IWwwFormUrlDecoderEntry IID___FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry
#define IIterable_IWwwFormUrlDecoderEntryVtbl __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl
#define IIterable_IWwwFormUrlDecoderEntry __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry
#define IIterable_IWwwFormUrlDecoderEntry_QueryInterface __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_QueryInterface
#define IIterable_IWwwFormUrlDecoderEntry_AddRef __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_AddRef
#define IIterable_IWwwFormUrlDecoderEntry_Release __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_Release
#define IIterable_IWwwFormUrlDecoderEntry_GetIids __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetIids
#define IIterable_IWwwFormUrlDecoderEntry_GetRuntimeClassName __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetRuntimeClassName
#define IIterable_IWwwFormUrlDecoderEntry_GetTrustLevel __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetTrustLevel
#define IIterable_IWwwFormUrlDecoderEntry_First __FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Foundation::Uri* > interface
 */
#ifndef ____FIIterable_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CFoundation__CUri, 0xb0d63b78, 0x78ad, 0x5e31, 0xb6,0xd8, 0xe3,0x2a,0x0e,0x16,0xc4,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("b0d63b78-78ad-5e31-b6d8-e32a0e16c447")
                IIterable<ABI::Windows::Foundation::Uri* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Foundation::Uri*, ABI::Windows::Foundation::IUriRuntimeClass* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CFoundation__CUri, 0xb0d63b78, 0x78ad, 0x5e31, 0xb6,0xd8, 0xe3,0x2a,0x0e,0x16,0xc4,0x47)
#endif
#else
typedef struct __FIIterable_1_Windows__CFoundation__CUriVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Foundation::Uri* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CFoundation__CUri *This,
        __FIIterator_1_Windows__CFoundation__CUri **value);

    END_INTERFACE
} __FIIterable_1_Windows__CFoundation__CUriVtbl;

interface __FIIterable_1_Windows__CFoundation__CUri {
    CONST_VTBL __FIIterable_1_Windows__CFoundation__CUriVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CFoundation__CUri_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CFoundation__CUri_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CFoundation__CUri_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CFoundation__CUri_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CFoundation__CUri_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CFoundation__CUri_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Foundation::Uri* > methods ***/
#define __FIIterable_1_Windows__CFoundation__CUri_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CFoundation__CUri_QueryInterface(__FIIterable_1_Windows__CFoundation__CUri* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CFoundation__CUri_AddRef(__FIIterable_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CFoundation__CUri_Release(__FIIterable_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CFoundation__CUri_GetIids(__FIIterable_1_Windows__CFoundation__CUri* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CFoundation__CUri_GetRuntimeClassName(__FIIterable_1_Windows__CFoundation__CUri* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CFoundation__CUri_GetTrustLevel(__FIIterable_1_Windows__CFoundation__CUri* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Foundation::Uri* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CFoundation__CUri_First(__FIIterable_1_Windows__CFoundation__CUri* This,__FIIterator_1_Windows__CFoundation__CUri **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_Uri IID___FIIterable_1_Windows__CFoundation__CUri
#define IIterable_UriVtbl __FIIterable_1_Windows__CFoundation__CUriVtbl
#define IIterable_Uri __FIIterable_1_Windows__CFoundation__CUri
#define IIterable_Uri_QueryInterface __FIIterable_1_Windows__CFoundation__CUri_QueryInterface
#define IIterable_Uri_AddRef __FIIterable_1_Windows__CFoundation__CUri_AddRef
#define IIterable_Uri_Release __FIIterable_1_Windows__CFoundation__CUri_Release
#define IIterable_Uri_GetIids __FIIterable_1_Windows__CFoundation__CUri_GetIids
#define IIterable_Uri_GetRuntimeClassName __FIIterable_1_Windows__CFoundation__CUri_GetRuntimeClassName
#define IIterable_Uri_GetTrustLevel __FIIterable_1_Windows__CFoundation__CUri_GetTrustLevel
#define IIterable_Uri_First __FIIterable_1_Windows__CFoundation__CUri_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<HSTRING > interface
 */
#ifndef ____FIIterator_1_HSTRING_INTERFACE_DEFINED__
#define ____FIIterator_1_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_HSTRING, 0x8c304ebb, 0x6615, 0x50a4, 0x88,0x29, 0x87,0x9e,0xcd,0x44,0x32,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("8c304ebb-6615-50a4-8829-879ecd443236")
                IIterator<HSTRING > : IIterator_impl<HSTRING >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_HSTRING, 0x8c304ebb, 0x6615, 0x50a4, 0x88,0x29, 0x87,0x9e,0xcd,0x44,0x32,0x36)
#endif
#else
typedef struct __FIIterator_1_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<HSTRING > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_HSTRING *This,
        HSTRING *value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_HSTRING *This,
        UINT32 items_size,
        HSTRING *items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_HSTRINGVtbl;

interface __FIIterator_1_HSTRING {
    CONST_VTBL __FIIterator_1_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<HSTRING > methods ***/
#define __FIIterator_1_HSTRING_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_HSTRING_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_HSTRING_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_HSTRING_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_HSTRING_QueryInterface(__FIIterator_1_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_HSTRING_AddRef(__FIIterator_1_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_HSTRING_Release(__FIIterator_1_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_HSTRING_GetIids(__FIIterator_1_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_HSTRING_GetRuntimeClassName(__FIIterator_1_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_HSTRING_GetTrustLevel(__FIIterator_1_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<HSTRING > methods ***/
static inline HRESULT __FIIterator_1_HSTRING_get_Current(__FIIterator_1_HSTRING* This,HSTRING *value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_HSTRING_get_HasCurrent(__FIIterator_1_HSTRING* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_HSTRING_MoveNext(__FIIterator_1_HSTRING* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_HSTRING_GetMany(__FIIterator_1_HSTRING* This,UINT32 items_size,HSTRING *items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_HSTRING IID___FIIterator_1_HSTRING
#define IIterator_HSTRINGVtbl __FIIterator_1_HSTRINGVtbl
#define IIterator_HSTRING __FIIterator_1_HSTRING
#define IIterator_HSTRING_QueryInterface __FIIterator_1_HSTRING_QueryInterface
#define IIterator_HSTRING_AddRef __FIIterator_1_HSTRING_AddRef
#define IIterator_HSTRING_Release __FIIterator_1_HSTRING_Release
#define IIterator_HSTRING_GetIids __FIIterator_1_HSTRING_GetIids
#define IIterator_HSTRING_GetRuntimeClassName __FIIterator_1_HSTRING_GetRuntimeClassName
#define IIterator_HSTRING_GetTrustLevel __FIIterator_1_HSTRING_GetTrustLevel
#define IIterator_HSTRING_get_Current __FIIterator_1_HSTRING_get_Current
#define IIterator_HSTRING_get_HasCurrent __FIIterator_1_HSTRING_get_HasCurrent
#define IIterator_HSTRING_MoveNext __FIIterator_1_HSTRING_MoveNext
#define IIterator_HSTRING_GetMany __FIIterator_1_HSTRING_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<IInspectable* > interface
 */
#ifndef ____FIIterator_1_IInspectable_INTERFACE_DEFINED__
#define ____FIIterator_1_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_IInspectable, 0x44a94f2d, 0x04f8, 0x5091, 0xb3,0x36, 0xbe,0x78,0x92,0xdd,0x10,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("44a94f2d-04f8-5091-b336-be7892dd10be")
                IIterator<IInspectable* > : IIterator_impl<IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_IInspectable, 0x44a94f2d, 0x04f8, 0x5091, 0xb3,0x36, 0xbe,0x78,0x92,0xdd,0x10,0xbe)
#endif
#else
typedef struct __FIIterator_1_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_IInspectable *This,
        IInspectable **value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_IInspectable *This,
        UINT32 items_size,
        IInspectable **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_IInspectableVtbl;

interface __FIIterator_1_IInspectable {
    CONST_VTBL __FIIterator_1_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<IInspectable* > methods ***/
#define __FIIterator_1_IInspectable_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_IInspectable_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_IInspectable_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_IInspectable_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_IInspectable_QueryInterface(__FIIterator_1_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_IInspectable_AddRef(__FIIterator_1_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_IInspectable_Release(__FIIterator_1_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_IInspectable_GetIids(__FIIterator_1_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_IInspectable_GetRuntimeClassName(__FIIterator_1_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_IInspectable_GetTrustLevel(__FIIterator_1_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<IInspectable* > methods ***/
static inline HRESULT __FIIterator_1_IInspectable_get_Current(__FIIterator_1_IInspectable* This,IInspectable **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_IInspectable_get_HasCurrent(__FIIterator_1_IInspectable* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_IInspectable_MoveNext(__FIIterator_1_IInspectable* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_IInspectable_GetMany(__FIIterator_1_IInspectable* This,UINT32 items_size,IInspectable **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_IInspectable IID___FIIterator_1_IInspectable
#define IIterator_IInspectableVtbl __FIIterator_1_IInspectableVtbl
#define IIterator_IInspectable __FIIterator_1_IInspectable
#define IIterator_IInspectable_QueryInterface __FIIterator_1_IInspectable_QueryInterface
#define IIterator_IInspectable_AddRef __FIIterator_1_IInspectable_AddRef
#define IIterator_IInspectable_Release __FIIterator_1_IInspectable_Release
#define IIterator_IInspectable_GetIids __FIIterator_1_IInspectable_GetIids
#define IIterator_IInspectable_GetRuntimeClassName __FIIterator_1_IInspectable_GetRuntimeClassName
#define IIterator_IInspectable_GetTrustLevel __FIIterator_1_IInspectable_GetTrustLevel
#define IIterator_IInspectable_get_Current __FIIterator_1_IInspectable_get_Current
#define IIterator_IInspectable_get_HasCurrent __FIIterator_1_IInspectable_get_HasCurrent
#define IIterator_IInspectable_MoveNext __FIIterator_1_IInspectable_MoveNext
#define IIterator_IInspectable_GetMany __FIIterator_1_IInspectable_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > interface
 */
#ifndef ____FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry, 0x32e54295, 0x373c, 0x50cb, 0x80,0xa1, 0x46,0x8a,0x99,0x0c,0xa7,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("32e54295-373c-50cb-80a1-468a990ca780")
                IIterator<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > : IIterator_impl<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry, 0x32e54295, 0x373c, 0x50cb, 0x80,0xa1, 0x46,0x8a,0x99,0x0c,0xa7,0x80)
#endif
#else
typedef struct __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry *This,
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry **value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry *This,
        UINT32 items_size,
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl;

interface __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry {
    CONST_VTBL __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > methods ***/
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_QueryInterface(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_AddRef(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_Release(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetIids(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetRuntimeClassName(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetTrustLevel(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_get_Current(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_get_HasCurrent(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_MoveNext(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetMany(__FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,UINT32 items_size,__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_IWwwFormUrlDecoderEntry IID___FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry
#define IIterator_IWwwFormUrlDecoderEntryVtbl __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl
#define IIterator_IWwwFormUrlDecoderEntry __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry
#define IIterator_IWwwFormUrlDecoderEntry_QueryInterface __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_QueryInterface
#define IIterator_IWwwFormUrlDecoderEntry_AddRef __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_AddRef
#define IIterator_IWwwFormUrlDecoderEntry_Release __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_Release
#define IIterator_IWwwFormUrlDecoderEntry_GetIids __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetIids
#define IIterator_IWwwFormUrlDecoderEntry_GetRuntimeClassName __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetRuntimeClassName
#define IIterator_IWwwFormUrlDecoderEntry_GetTrustLevel __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetTrustLevel
#define IIterator_IWwwFormUrlDecoderEntry_get_Current __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_get_Current
#define IIterator_IWwwFormUrlDecoderEntry_get_HasCurrent __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_get_HasCurrent
#define IIterator_IWwwFormUrlDecoderEntry_MoveNext __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_MoveNext
#define IIterator_IWwwFormUrlDecoderEntry_GetMany __FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Foundation::Uri* > interface
 */
#ifndef ____FIIterator_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CFoundation__CUri, 0x1c157d0f, 0x5efe, 0x5cec, 0xbb,0xd6, 0x0c,0x6c,0xe9,0xaf,0x07,0xa5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("1c157d0f-5efe-5cec-bbd6-0c6ce9af07a5")
                IIterator<ABI::Windows::Foundation::Uri* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Foundation::Uri*, ABI::Windows::Foundation::IUriRuntimeClass* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CFoundation__CUri, 0x1c157d0f, 0x5efe, 0x5cec, 0xbb,0xd6, 0x0c,0x6c,0xe9,0xaf,0x07,0xa5)
#endif
#else
typedef struct __FIIterator_1_Windows__CFoundation__CUriVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Foundation::Uri* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CFoundation__CUri *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

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

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

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CFoundation__CUri *This,
        UINT32 items_size,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CFoundation__CUriVtbl;

interface __FIIterator_1_Windows__CFoundation__CUri {
    CONST_VTBL __FIIterator_1_Windows__CFoundation__CUriVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CFoundation__CUri_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CFoundation__CUri_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CFoundation__CUri_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CFoundation__CUri_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CFoundation__CUri_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CFoundation__CUri_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Foundation::Uri* > methods ***/
#define __FIIterator_1_Windows__CFoundation__CUri_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CFoundation__CUri_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CFoundation__CUri_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CFoundation__CUri_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CFoundation__CUri_QueryInterface(__FIIterator_1_Windows__CFoundation__CUri* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CFoundation__CUri_AddRef(__FIIterator_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CFoundation__CUri_Release(__FIIterator_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CFoundation__CUri_GetIids(__FIIterator_1_Windows__CFoundation__CUri* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CFoundation__CUri_GetRuntimeClassName(__FIIterator_1_Windows__CFoundation__CUri* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CFoundation__CUri_GetTrustLevel(__FIIterator_1_Windows__CFoundation__CUri* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Foundation::Uri* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CFoundation__CUri_get_Current(__FIIterator_1_Windows__CFoundation__CUri* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CFoundation__CUri_get_HasCurrent(__FIIterator_1_Windows__CFoundation__CUri* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CFoundation__CUri_MoveNext(__FIIterator_1_Windows__CFoundation__CUri* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CFoundation__CUri_GetMany(__FIIterator_1_Windows__CFoundation__CUri* This,UINT32 items_size,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_Uri IID___FIIterator_1_Windows__CFoundation__CUri
#define IIterator_UriVtbl __FIIterator_1_Windows__CFoundation__CUriVtbl
#define IIterator_Uri __FIIterator_1_Windows__CFoundation__CUri
#define IIterator_Uri_QueryInterface __FIIterator_1_Windows__CFoundation__CUri_QueryInterface
#define IIterator_Uri_AddRef __FIIterator_1_Windows__CFoundation__CUri_AddRef
#define IIterator_Uri_Release __FIIterator_1_Windows__CFoundation__CUri_Release
#define IIterator_Uri_GetIids __FIIterator_1_Windows__CFoundation__CUri_GetIids
#define IIterator_Uri_GetRuntimeClassName __FIIterator_1_Windows__CFoundation__CUri_GetRuntimeClassName
#define IIterator_Uri_GetTrustLevel __FIIterator_1_Windows__CFoundation__CUri_GetTrustLevel
#define IIterator_Uri_get_Current __FIIterator_1_Windows__CFoundation__CUri_get_Current
#define IIterator_Uri_get_HasCurrent __FIIterator_1_Windows__CFoundation__CUri_get_HasCurrent
#define IIterator_Uri_MoveNext __FIIterator_1_Windows__CFoundation__CUri_MoveNext
#define IIterator_Uri_GetMany __FIIterator_1_Windows__CFoundation__CUri_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<BYTE > interface
 */
#ifndef ____FIVectorView_1_BYTE_INTERFACE_DEFINED__
#define ____FIVectorView_1_BYTE_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_BYTE, 0x6d05fb29, 0x7885, 0x544e, 0x93,0x82, 0xa1,0xad,0x39,0x1a,0x3f,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("6d05fb29-7885-544e-9382-a1ad391a3fa4")
                IVectorView<BYTE > : IVectorView_impl<BYTE >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_BYTE, 0x6d05fb29, 0x7885, 0x544e, 0x93,0x82, 0xa1,0xad,0x39,0x1a,0x3f,0xa4)
#endif
#else
typedef struct __FIVectorView_1_BYTEVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<BYTE > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_BYTE *This,
        UINT32 index,
        BYTE *value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_BYTE *This,
        BYTE element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_BYTE *This,
        UINT32 start_index,
        UINT32 items_size,
        BYTE *items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_BYTEVtbl;

interface __FIVectorView_1_BYTE {
    CONST_VTBL __FIVectorView_1_BYTEVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_BYTE_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_BYTE_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_BYTE_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_BYTE_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_BYTE_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_BYTE_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<BYTE > methods ***/
#define __FIVectorView_1_BYTE_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_BYTE_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_BYTE_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_BYTE_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_BYTE_QueryInterface(__FIVectorView_1_BYTE* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_BYTE_AddRef(__FIVectorView_1_BYTE* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_BYTE_Release(__FIVectorView_1_BYTE* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_BYTE_GetIids(__FIVectorView_1_BYTE* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_BYTE_GetRuntimeClassName(__FIVectorView_1_BYTE* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_BYTE_GetTrustLevel(__FIVectorView_1_BYTE* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<BYTE > methods ***/
static inline HRESULT __FIVectorView_1_BYTE_GetAt(__FIVectorView_1_BYTE* This,UINT32 index,BYTE *value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_BYTE_get_Size(__FIVectorView_1_BYTE* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_BYTE_IndexOf(__FIVectorView_1_BYTE* This,BYTE element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_BYTE_GetMany(__FIVectorView_1_BYTE* This,UINT32 start_index,UINT32 items_size,BYTE *items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_BYTE IID___FIVectorView_1_BYTE
#define IVectorView_BYTEVtbl __FIVectorView_1_BYTEVtbl
#define IVectorView_BYTE __FIVectorView_1_BYTE
#define IVectorView_BYTE_QueryInterface __FIVectorView_1_BYTE_QueryInterface
#define IVectorView_BYTE_AddRef __FIVectorView_1_BYTE_AddRef
#define IVectorView_BYTE_Release __FIVectorView_1_BYTE_Release
#define IVectorView_BYTE_GetIids __FIVectorView_1_BYTE_GetIids
#define IVectorView_BYTE_GetRuntimeClassName __FIVectorView_1_BYTE_GetRuntimeClassName
#define IVectorView_BYTE_GetTrustLevel __FIVectorView_1_BYTE_GetTrustLevel
#define IVectorView_BYTE_GetAt __FIVectorView_1_BYTE_GetAt
#define IVectorView_BYTE_get_Size __FIVectorView_1_BYTE_get_Size
#define IVectorView_BYTE_IndexOf __FIVectorView_1_BYTE_IndexOf
#define IVectorView_BYTE_GetMany __FIVectorView_1_BYTE_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_BYTE_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<HSTRING > interface
 */
#ifndef ____FIVectorView_1_HSTRING_INTERFACE_DEFINED__
#define ____FIVectorView_1_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_HSTRING, 0x2f13c006, 0xa03a, 0x5f69, 0xb0,0x90, 0x75,0xa4,0x3e,0x33,0x42,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("2f13c006-a03a-5f69-b090-75a43e33423e")
                IVectorView<HSTRING > : IVectorView_impl<HSTRING >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_HSTRING, 0x2f13c006, 0xa03a, 0x5f69, 0xb0,0x90, 0x75,0xa4,0x3e,0x33,0x42,0x3e)
#endif
#else
typedef struct __FIVectorView_1_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<HSTRING > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_HSTRING *This,
        UINT32 index,
        HSTRING *value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_HSTRING *This,
        HSTRING element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_HSTRING *This,
        UINT32 start_index,
        UINT32 items_size,
        HSTRING *items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_HSTRINGVtbl;

interface __FIVectorView_1_HSTRING {
    CONST_VTBL __FIVectorView_1_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<HSTRING > methods ***/
#define __FIVectorView_1_HSTRING_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_HSTRING_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_HSTRING_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_HSTRING_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_HSTRING_QueryInterface(__FIVectorView_1_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_HSTRING_AddRef(__FIVectorView_1_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_HSTRING_Release(__FIVectorView_1_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_HSTRING_GetIids(__FIVectorView_1_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_HSTRING_GetRuntimeClassName(__FIVectorView_1_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_HSTRING_GetTrustLevel(__FIVectorView_1_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<HSTRING > methods ***/
static inline HRESULT __FIVectorView_1_HSTRING_GetAt(__FIVectorView_1_HSTRING* This,UINT32 index,HSTRING *value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_HSTRING_get_Size(__FIVectorView_1_HSTRING* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_HSTRING_IndexOf(__FIVectorView_1_HSTRING* This,HSTRING element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_HSTRING_GetMany(__FIVectorView_1_HSTRING* This,UINT32 start_index,UINT32 items_size,HSTRING *items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_HSTRING IID___FIVectorView_1_HSTRING
#define IVectorView_HSTRINGVtbl __FIVectorView_1_HSTRINGVtbl
#define IVectorView_HSTRING __FIVectorView_1_HSTRING
#define IVectorView_HSTRING_QueryInterface __FIVectorView_1_HSTRING_QueryInterface
#define IVectorView_HSTRING_AddRef __FIVectorView_1_HSTRING_AddRef
#define IVectorView_HSTRING_Release __FIVectorView_1_HSTRING_Release
#define IVectorView_HSTRING_GetIids __FIVectorView_1_HSTRING_GetIids
#define IVectorView_HSTRING_GetRuntimeClassName __FIVectorView_1_HSTRING_GetRuntimeClassName
#define IVectorView_HSTRING_GetTrustLevel __FIVectorView_1_HSTRING_GetTrustLevel
#define IVectorView_HSTRING_GetAt __FIVectorView_1_HSTRING_GetAt
#define IVectorView_HSTRING_get_Size __FIVectorView_1_HSTRING_get_Size
#define IVectorView_HSTRING_IndexOf __FIVectorView_1_HSTRING_IndexOf
#define IVectorView_HSTRING_GetMany __FIVectorView_1_HSTRING_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<IInspectable* > interface
 */
#ifndef ____FIVectorView_1_IInspectable_INTERFACE_DEFINED__
#define ____FIVectorView_1_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_IInspectable, 0xa6487363, 0xb074, 0x5c60, 0xab,0x16, 0x86,0x6d,0xce,0x4e,0xe5,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("a6487363-b074-5c60-ab16-866dce4ee54d")
                IVectorView<IInspectable* > : IVectorView_impl<IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_IInspectable, 0xa6487363, 0xb074, 0x5c60, 0xab,0x16, 0x86,0x6d,0xce,0x4e,0xe5,0x4d)
#endif
#else
typedef struct __FIVectorView_1_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_IInspectable *This,
        UINT32 index,
        IInspectable **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_IInspectable *This,
        IInspectable *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_IInspectable *This,
        UINT32 start_index,
        UINT32 items_size,
        IInspectable **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_IInspectableVtbl;

interface __FIVectorView_1_IInspectable {
    CONST_VTBL __FIVectorView_1_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<IInspectable* > methods ***/
#define __FIVectorView_1_IInspectable_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_IInspectable_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_IInspectable_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_IInspectable_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_IInspectable_QueryInterface(__FIVectorView_1_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_IInspectable_AddRef(__FIVectorView_1_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_IInspectable_Release(__FIVectorView_1_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_IInspectable_GetIids(__FIVectorView_1_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_IInspectable_GetRuntimeClassName(__FIVectorView_1_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_IInspectable_GetTrustLevel(__FIVectorView_1_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<IInspectable* > methods ***/
static inline HRESULT __FIVectorView_1_IInspectable_GetAt(__FIVectorView_1_IInspectable* This,UINT32 index,IInspectable **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_IInspectable_get_Size(__FIVectorView_1_IInspectable* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_IInspectable_IndexOf(__FIVectorView_1_IInspectable* This,IInspectable *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_IInspectable_GetMany(__FIVectorView_1_IInspectable* This,UINT32 start_index,UINT32 items_size,IInspectable **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_IInspectable IID___FIVectorView_1_IInspectable
#define IVectorView_IInspectableVtbl __FIVectorView_1_IInspectableVtbl
#define IVectorView_IInspectable __FIVectorView_1_IInspectable
#define IVectorView_IInspectable_QueryInterface __FIVectorView_1_IInspectable_QueryInterface
#define IVectorView_IInspectable_AddRef __FIVectorView_1_IInspectable_AddRef
#define IVectorView_IInspectable_Release __FIVectorView_1_IInspectable_Release
#define IVectorView_IInspectable_GetIids __FIVectorView_1_IInspectable_GetIids
#define IVectorView_IInspectable_GetRuntimeClassName __FIVectorView_1_IInspectable_GetRuntimeClassName
#define IVectorView_IInspectable_GetTrustLevel __FIVectorView_1_IInspectable_GetTrustLevel
#define IVectorView_IInspectable_GetAt __FIVectorView_1_IInspectable_GetAt
#define IVectorView_IInspectable_get_Size __FIVectorView_1_IInspectable_get_Size
#define IVectorView_IInspectable_IndexOf __FIVectorView_1_IInspectable_IndexOf
#define IVectorView_IInspectable_GetMany __FIVectorView_1_IInspectable_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > interface
 */
#ifndef ____FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry, 0xb1f00d3b, 0x1f06, 0x5117, 0x93,0xea, 0x2a,0x0d,0x79,0x11,0x67,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("b1f00d3b-1f06-5117-93ea-2a0d79116701")
                IVectorView<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > : IVectorView_impl<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry, 0xb1f00d3b, 0x1f06, 0x5117, 0x93,0xea, 0x2a,0x0d,0x79,0x11,0x67,0x01)
#endif
#else
typedef struct __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry *This,
        UINT32 index,
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry *This,
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl;

interface __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry {
    CONST_VTBL __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > methods ***/
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_QueryInterface(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_AddRef(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_Release(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetIids(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetRuntimeClassName(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetTrustLevel(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Foundation::IWwwFormUrlDecoderEntry* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetAt(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,UINT32 index,__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_get_Size(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_IndexOf(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetMany(__FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CFoundation_CIWwwFormUrlDecoderEntry **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_IWwwFormUrlDecoderEntry IID___FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry
#define IVectorView_IWwwFormUrlDecoderEntryVtbl __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntryVtbl
#define IVectorView_IWwwFormUrlDecoderEntry __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry
#define IVectorView_IWwwFormUrlDecoderEntry_QueryInterface __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_QueryInterface
#define IVectorView_IWwwFormUrlDecoderEntry_AddRef __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_AddRef
#define IVectorView_IWwwFormUrlDecoderEntry_Release __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_Release
#define IVectorView_IWwwFormUrlDecoderEntry_GetIids __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetIids
#define IVectorView_IWwwFormUrlDecoderEntry_GetRuntimeClassName __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetRuntimeClassName
#define IVectorView_IWwwFormUrlDecoderEntry_GetTrustLevel __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetTrustLevel
#define IVectorView_IWwwFormUrlDecoderEntry_GetAt __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetAt
#define IVectorView_IWwwFormUrlDecoderEntry_get_Size __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_get_Size
#define IVectorView_IWwwFormUrlDecoderEntry_IndexOf __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_IndexOf
#define IVectorView_IWwwFormUrlDecoderEntry_GetMany __FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CFoundation__CIWwwFormUrlDecoderEntry_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Foundation::Uri* > interface
 */
#ifndef ____FIVectorView_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CFoundation__CUri, 0x4b8385bd, 0xa2cd, 0x5ff1, 0xbf,0x74, 0x7e,0xa5,0x80,0x42,0x3e,0x50);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("4b8385bd-a2cd-5ff1-bf74-7ea580423e50")
                IVectorView<ABI::Windows::Foundation::Uri* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Foundation::Uri*, ABI::Windows::Foundation::IUriRuntimeClass* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CFoundation__CUri, 0x4b8385bd, 0xa2cd, 0x5ff1, 0xbf,0x74, 0x7e,0xa5,0x80,0x42,0x3e,0x50)
#endif
#else
typedef struct __FIVectorView_1_Windows__CFoundation__CUriVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Foundation::Uri* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CFoundation__CUri *This,
        UINT32 index,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CFoundation__CUri *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CFoundation__CUri *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CFoundation__CUriVtbl;

interface __FIVectorView_1_Windows__CFoundation__CUri {
    CONST_VTBL __FIVectorView_1_Windows__CFoundation__CUriVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CFoundation__CUri_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CFoundation__CUri_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CFoundation__CUri_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CFoundation__CUri_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CFoundation__CUri_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CFoundation__CUri_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Foundation::Uri* > methods ***/
#define __FIVectorView_1_Windows__CFoundation__CUri_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CFoundation__CUri_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CFoundation__CUri_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CFoundation__CUri_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CUri_QueryInterface(__FIVectorView_1_Windows__CFoundation__CUri* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CFoundation__CUri_AddRef(__FIVectorView_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CFoundation__CUri_Release(__FIVectorView_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CUri_GetIids(__FIVectorView_1_Windows__CFoundation__CUri* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CUri_GetRuntimeClassName(__FIVectorView_1_Windows__CFoundation__CUri* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CUri_GetTrustLevel(__FIVectorView_1_Windows__CFoundation__CUri* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Foundation::Uri* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CUri_GetAt(__FIVectorView_1_Windows__CFoundation__CUri* This,UINT32 index,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CUri_get_Size(__FIVectorView_1_Windows__CFoundation__CUri* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CUri_IndexOf(__FIVectorView_1_Windows__CFoundation__CUri* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CFoundation__CUri_GetMany(__FIVectorView_1_Windows__CFoundation__CUri* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_Uri IID___FIVectorView_1_Windows__CFoundation__CUri
#define IVectorView_UriVtbl __FIVectorView_1_Windows__CFoundation__CUriVtbl
#define IVectorView_Uri __FIVectorView_1_Windows__CFoundation__CUri
#define IVectorView_Uri_QueryInterface __FIVectorView_1_Windows__CFoundation__CUri_QueryInterface
#define IVectorView_Uri_AddRef __FIVectorView_1_Windows__CFoundation__CUri_AddRef
#define IVectorView_Uri_Release __FIVectorView_1_Windows__CFoundation__CUri_Release
#define IVectorView_Uri_GetIids __FIVectorView_1_Windows__CFoundation__CUri_GetIids
#define IVectorView_Uri_GetRuntimeClassName __FIVectorView_1_Windows__CFoundation__CUri_GetRuntimeClassName
#define IVectorView_Uri_GetTrustLevel __FIVectorView_1_Windows__CFoundation__CUri_GetTrustLevel
#define IVectorView_Uri_GetAt __FIVectorView_1_Windows__CFoundation__CUri_GetAt
#define IVectorView_Uri_get_Size __FIVectorView_1_Windows__CFoundation__CUri_get_Size
#define IVectorView_Uri_IndexOf __FIVectorView_1_Windows__CFoundation__CUri_IndexOf
#define IVectorView_Uri_GetMany __FIVectorView_1_Windows__CFoundation__CUri_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<HSTRING > interface
 */
#ifndef ____FIVector_1_HSTRING_INTERFACE_DEFINED__
#define ____FIVector_1_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_HSTRING, 0x98b9acc1, 0x4b56, 0x532e, 0xac,0x73, 0x03,0xd5,0x29,0x1c,0xca,0x90);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("98b9acc1-4b56-532e-ac73-03d5291cca90")
                IVector<HSTRING > : IVector_impl<HSTRING >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_HSTRING, 0x98b9acc1, 0x4b56, 0x532e, 0xac,0x73, 0x03,0xd5,0x29,0x1c,0xca,0x90)
#endif
#else
typedef struct __FIVector_1_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<HSTRING > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_HSTRING *This,
        UINT32 index,
        HSTRING *value);

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

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_HSTRING *This,
        __FIVectorView_1_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_HSTRING *This,
        HSTRING element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_HSTRING *This,
        UINT32 index,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_HSTRING *This,
        UINT32 index,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_HSTRING *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_HSTRING *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_HSTRING *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIVector_1_HSTRING *This);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_HSTRING *This,
        UINT32 start_index,
        UINT32 items_size,
        HSTRING *items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_HSTRING *This,
        UINT32 count,
        HSTRING *items);

    END_INTERFACE
} __FIVector_1_HSTRINGVtbl;

interface __FIVector_1_HSTRING {
    CONST_VTBL __FIVector_1_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<HSTRING > methods ***/
#define __FIVector_1_HSTRING_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_HSTRING_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_HSTRING_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_HSTRING_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_HSTRING_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_HSTRING_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_HSTRING_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_HSTRING_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_HSTRING_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_HSTRING_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_HSTRING_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_HSTRING_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVector_1_HSTRING_QueryInterface(__FIVector_1_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVector_1_HSTRING_AddRef(__FIVector_1_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVector_1_HSTRING_Release(__FIVector_1_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVector_1_HSTRING_GetIids(__FIVector_1_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVector_1_HSTRING_GetRuntimeClassName(__FIVector_1_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVector_1_HSTRING_GetTrustLevel(__FIVector_1_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<HSTRING > methods ***/
static inline HRESULT __FIVector_1_HSTRING_GetAt(__FIVector_1_HSTRING* This,UINT32 index,HSTRING *value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVector_1_HSTRING_get_Size(__FIVector_1_HSTRING* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVector_1_HSTRING_GetView(__FIVector_1_HSTRING* This,__FIVectorView_1_HSTRING **value) {
    return This->lpVtbl->GetView(This,value);
}
static inline HRESULT __FIVector_1_HSTRING_IndexOf(__FIVector_1_HSTRING* This,HSTRING element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVector_1_HSTRING_SetAt(__FIVector_1_HSTRING* This,UINT32 index,HSTRING value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static inline HRESULT __FIVector_1_HSTRING_InsertAt(__FIVector_1_HSTRING* This,UINT32 index,HSTRING value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static inline HRESULT __FIVector_1_HSTRING_RemoveAt(__FIVector_1_HSTRING* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static inline HRESULT __FIVector_1_HSTRING_Append(__FIVector_1_HSTRING* This,HSTRING value) {
    return This->lpVtbl->Append(This,value);
}
static inline HRESULT __FIVector_1_HSTRING_RemoveAtEnd(__FIVector_1_HSTRING* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static inline HRESULT __FIVector_1_HSTRING_Clear(__FIVector_1_HSTRING* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __FIVector_1_HSTRING_GetMany(__FIVector_1_HSTRING* This,UINT32 start_index,UINT32 items_size,HSTRING *items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static inline HRESULT __FIVector_1_HSTRING_ReplaceAll(__FIVector_1_HSTRING* This,UINT32 count,HSTRING *items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_HSTRING IID___FIVector_1_HSTRING
#define IVector_HSTRINGVtbl __FIVector_1_HSTRINGVtbl
#define IVector_HSTRING __FIVector_1_HSTRING
#define IVector_HSTRING_QueryInterface __FIVector_1_HSTRING_QueryInterface
#define IVector_HSTRING_AddRef __FIVector_1_HSTRING_AddRef
#define IVector_HSTRING_Release __FIVector_1_HSTRING_Release
#define IVector_HSTRING_GetIids __FIVector_1_HSTRING_GetIids
#define IVector_HSTRING_GetRuntimeClassName __FIVector_1_HSTRING_GetRuntimeClassName
#define IVector_HSTRING_GetTrustLevel __FIVector_1_HSTRING_GetTrustLevel
#define IVector_HSTRING_GetAt __FIVector_1_HSTRING_GetAt
#define IVector_HSTRING_get_Size __FIVector_1_HSTRING_get_Size
#define IVector_HSTRING_GetView __FIVector_1_HSTRING_GetView
#define IVector_HSTRING_IndexOf __FIVector_1_HSTRING_IndexOf
#define IVector_HSTRING_SetAt __FIVector_1_HSTRING_SetAt
#define IVector_HSTRING_InsertAt __FIVector_1_HSTRING_InsertAt
#define IVector_HSTRING_RemoveAt __FIVector_1_HSTRING_RemoveAt
#define IVector_HSTRING_Append __FIVector_1_HSTRING_Append
#define IVector_HSTRING_RemoveAtEnd __FIVector_1_HSTRING_RemoveAtEnd
#define IVector_HSTRING_Clear __FIVector_1_HSTRING_Clear
#define IVector_HSTRING_GetMany __FIVector_1_HSTRING_GetMany
#define IVector_HSTRING_ReplaceAll __FIVector_1_HSTRING_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<IInspectable* > interface
 */
#ifndef ____FIVector_1_IInspectable_INTERFACE_DEFINED__
#define ____FIVector_1_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_IInspectable, 0xb32bdca4, 0x5e52, 0x5b27, 0xbc,0x5d, 0xd6,0x6a,0x1a,0x26,0x8c,0x2a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("b32bdca4-5e52-5b27-bc5d-d66a1a268c2a")
                IVector<IInspectable* > : IVector_impl<IInspectable* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_IInspectable, 0xb32bdca4, 0x5e52, 0x5b27, 0xbc,0x5d, 0xd6,0x6a,0x1a,0x26,0x8c,0x2a)
#endif
#else
typedef struct __FIVector_1_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_IInspectable *This,
        UINT32 index,
        IInspectable **value);

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

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_IInspectable *This,
        __FIVectorView_1_IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_IInspectable *This,
        IInspectable *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_IInspectable *This,
        UINT32 index,
        IInspectable *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_IInspectable *This,
        UINT32 index,
        IInspectable *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_IInspectable *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_IInspectable *This,
        IInspectable *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_IInspectable *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIVector_1_IInspectable *This);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_IInspectable *This,
        UINT32 start_index,
        UINT32 items_size,
        IInspectable **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_IInspectable *This,
        UINT32 count,
        IInspectable **items);

    END_INTERFACE
} __FIVector_1_IInspectableVtbl;

interface __FIVector_1_IInspectable {
    CONST_VTBL __FIVector_1_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<IInspectable* > methods ***/
#define __FIVector_1_IInspectable_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_IInspectable_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_IInspectable_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_IInspectable_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_IInspectable_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_IInspectable_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_IInspectable_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_IInspectable_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_IInspectable_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_IInspectable_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_IInspectable_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_IInspectable_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVector_1_IInspectable_QueryInterface(__FIVector_1_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVector_1_IInspectable_AddRef(__FIVector_1_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVector_1_IInspectable_Release(__FIVector_1_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVector_1_IInspectable_GetIids(__FIVector_1_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVector_1_IInspectable_GetRuntimeClassName(__FIVector_1_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVector_1_IInspectable_GetTrustLevel(__FIVector_1_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<IInspectable* > methods ***/
static inline HRESULT __FIVector_1_IInspectable_GetAt(__FIVector_1_IInspectable* This,UINT32 index,IInspectable **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVector_1_IInspectable_get_Size(__FIVector_1_IInspectable* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVector_1_IInspectable_GetView(__FIVector_1_IInspectable* This,__FIVectorView_1_IInspectable **value) {
    return This->lpVtbl->GetView(This,value);
}
static inline HRESULT __FIVector_1_IInspectable_IndexOf(__FIVector_1_IInspectable* This,IInspectable *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVector_1_IInspectable_SetAt(__FIVector_1_IInspectable* This,UINT32 index,IInspectable *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static inline HRESULT __FIVector_1_IInspectable_InsertAt(__FIVector_1_IInspectable* This,UINT32 index,IInspectable *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static inline HRESULT __FIVector_1_IInspectable_RemoveAt(__FIVector_1_IInspectable* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static inline HRESULT __FIVector_1_IInspectable_Append(__FIVector_1_IInspectable* This,IInspectable *value) {
    return This->lpVtbl->Append(This,value);
}
static inline HRESULT __FIVector_1_IInspectable_RemoveAtEnd(__FIVector_1_IInspectable* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static inline HRESULT __FIVector_1_IInspectable_Clear(__FIVector_1_IInspectable* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __FIVector_1_IInspectable_GetMany(__FIVector_1_IInspectable* This,UINT32 start_index,UINT32 items_size,IInspectable **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static inline HRESULT __FIVector_1_IInspectable_ReplaceAll(__FIVector_1_IInspectable* This,UINT32 count,IInspectable **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_IInspectable IID___FIVector_1_IInspectable
#define IVector_IInspectableVtbl __FIVector_1_IInspectableVtbl
#define IVector_IInspectable __FIVector_1_IInspectable
#define IVector_IInspectable_QueryInterface __FIVector_1_IInspectable_QueryInterface
#define IVector_IInspectable_AddRef __FIVector_1_IInspectable_AddRef
#define IVector_IInspectable_Release __FIVector_1_IInspectable_Release
#define IVector_IInspectable_GetIids __FIVector_1_IInspectable_GetIids
#define IVector_IInspectable_GetRuntimeClassName __FIVector_1_IInspectable_GetRuntimeClassName
#define IVector_IInspectable_GetTrustLevel __FIVector_1_IInspectable_GetTrustLevel
#define IVector_IInspectable_GetAt __FIVector_1_IInspectable_GetAt
#define IVector_IInspectable_get_Size __FIVector_1_IInspectable_get_Size
#define IVector_IInspectable_GetView __FIVector_1_IInspectable_GetView
#define IVector_IInspectable_IndexOf __FIVector_1_IInspectable_IndexOf
#define IVector_IInspectable_SetAt __FIVector_1_IInspectable_SetAt
#define IVector_IInspectable_InsertAt __FIVector_1_IInspectable_InsertAt
#define IVector_IInspectable_RemoveAt __FIVector_1_IInspectable_RemoveAt
#define IVector_IInspectable_Append __FIVector_1_IInspectable_Append
#define IVector_IInspectable_RemoveAtEnd __FIVector_1_IInspectable_RemoveAtEnd
#define IVector_IInspectable_Clear __FIVector_1_IInspectable_Clear
#define IVector_IInspectable_GetMany __FIVector_1_IInspectable_GetMany
#define IVector_IInspectable_ReplaceAll __FIVector_1_IInspectable_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMapView<HSTRING,ABI::Windows::Foundation::Collections::IVectorView<HSTRING >* > interface
 */
#ifndef ____FIMapView_2_HSTRING___FIVectorView_1_HSTRING_INTERFACE_DEFINED__
#define ____FIMapView_2_HSTRING___FIVectorView_1_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMapView_2_HSTRING___FIVectorView_1_HSTRING, 0x2843d34f, 0xd3e5, 0x5fca, 0x9f,0xdc, 0xb5,0x68,0xdd,0x5c,0x1e,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("2843d34f-d3e5-5fca-9fdc-b568dd5c1e64")
                IMapView<HSTRING,ABI::Windows::Foundation::Collections::IVectorView<HSTRING >* > : IMapView_impl<HSTRING, ABI::Windows::Foundation::Collections::IVectorView<HSTRING >* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING, 0x2843d34f, 0xd3e5, 0x5fca, 0x9f,0xdc, 0xb5,0x68,0xdd,0x5c,0x1e,0x64)
#endif
#else
typedef struct __FIMapView_2_HSTRING___FIVectorView_1_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IMapView<HSTRING,ABI::Windows::Foundation::Collections::IVectorView<HSTRING >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMapView_2_HSTRING___FIVectorView_1_HSTRING *This,
        HSTRING key,
        __FIVectorView_1_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMapView_2_HSTRING___FIVectorView_1_HSTRING *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMapView_2_HSTRING___FIVectorView_1_HSTRING *This,
        HSTRING key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *Split)(
        __FIMapView_2_HSTRING___FIVectorView_1_HSTRING *This,
        __FIMapView_2_HSTRING___FIVectorView_1_HSTRING **first,
        __FIMapView_2_HSTRING___FIVectorView_1_HSTRING **second);

    END_INTERFACE
} __FIMapView_2_HSTRING___FIVectorView_1_HSTRINGVtbl;

interface __FIMapView_2_HSTRING___FIVectorView_1_HSTRING {
    CONST_VTBL __FIMapView_2_HSTRING___FIVectorView_1_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMapView<HSTRING,ABI::Windows::Foundation::Collections::IVectorView<HSTRING >* > methods ***/
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_Split(This,first,second) (This)->lpVtbl->Split(This,first,second)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_QueryInterface(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_AddRef(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_Release(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_GetIids(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_GetRuntimeClassName(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_GetTrustLevel(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMapView<HSTRING,ABI::Windows::Foundation::Collections::IVectorView<HSTRING >* > methods ***/
static inline HRESULT __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_Lookup(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING* This,HSTRING key,__FIVectorView_1_HSTRING **value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_get_Size(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_HasKey(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING* This,HSTRING key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_Split(__FIMapView_2_HSTRING___FIVectorView_1_HSTRING* This,__FIMapView_2_HSTRING___FIVectorView_1_HSTRING **first,__FIMapView_2_HSTRING___FIVectorView_1_HSTRING **second) {
    return This->lpVtbl->Split(This,first,second);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMapView_HSTRING_IVectorView_HSTRING IID___FIMapView_2_HSTRING___FIVectorView_1_HSTRING
#define IMapView_HSTRING_IVectorView_HSTRINGVtbl __FIMapView_2_HSTRING___FIVectorView_1_HSTRINGVtbl
#define IMapView_HSTRING_IVectorView_HSTRING __FIMapView_2_HSTRING___FIVectorView_1_HSTRING
#define IMapView_HSTRING_IVectorView_HSTRING_QueryInterface __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_QueryInterface
#define IMapView_HSTRING_IVectorView_HSTRING_AddRef __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_AddRef
#define IMapView_HSTRING_IVectorView_HSTRING_Release __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_Release
#define IMapView_HSTRING_IVectorView_HSTRING_GetIids __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_GetIids
#define IMapView_HSTRING_IVectorView_HSTRING_GetRuntimeClassName __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_GetRuntimeClassName
#define IMapView_HSTRING_IVectorView_HSTRING_GetTrustLevel __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_GetTrustLevel
#define IMapView_HSTRING_IVectorView_HSTRING_Lookup __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_Lookup
#define IMapView_HSTRING_IVectorView_HSTRING_get_Size __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_get_Size
#define IMapView_HSTRING_IVectorView_HSTRING_HasKey __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_HasKey
#define IMapView_HSTRING_IVectorView_HSTRING_Split __FIMapView_2_HSTRING___FIVectorView_1_HSTRING_Split
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMapView_2_HSTRING___FIVectorView_1_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEventHandler<IInspectable* > interface
 */
#ifndef ____FIEventHandler_1_IInspectable_INTERFACE_DEFINED__
#define ____FIEventHandler_1_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIEventHandler_1_IInspectable, 0xc50898f6, 0xc536, 0x5f47, 0x85,0x83, 0x8b,0x2c,0x24,0x38,0xa1,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c50898f6-c536-5f47-8583-8b2c2438a13b")
            IEventHandler<IInspectable* > : IEventHandler_impl<IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIEventHandler_1_IInspectable, 0xc50898f6, 0xc536, 0x5f47, 0x85,0x83, 0x8b,0x2c,0x24,0x38,0xa1,0x3b)
#endif
#else
typedef struct __FIEventHandler_1_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEventHandler<IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIEventHandler_1_IInspectable *This,
        IInspectable *sender,
        IInspectable *args);

    END_INTERFACE
} __FIEventHandler_1_IInspectableVtbl;

interface __FIEventHandler_1_IInspectable {
    CONST_VTBL __FIEventHandler_1_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIEventHandler_1_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIEventHandler_1_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIEventHandler_1_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IEventHandler<IInspectable* > methods ***/
#define __FIEventHandler_1_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIEventHandler_1_IInspectable_QueryInterface(__FIEventHandler_1_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIEventHandler_1_IInspectable_AddRef(__FIEventHandler_1_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIEventHandler_1_IInspectable_Release(__FIEventHandler_1_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventHandler<IInspectable* > methods ***/
static inline HRESULT __FIEventHandler_1_IInspectable_Invoke(__FIEventHandler_1_IInspectable* This,IInspectable *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IEventHandler_IInspectable IID___FIEventHandler_1_IInspectable
#define IEventHandler_IInspectableVtbl __FIEventHandler_1_IInspectableVtbl
#define IEventHandler_IInspectable __FIEventHandler_1_IInspectable
#define IEventHandler_IInspectable_QueryInterface __FIEventHandler_1_IInspectable_QueryInterface
#define IEventHandler_IInspectable_AddRef __FIEventHandler_1_IInspectable_AddRef
#define IEventHandler_IInspectable_Release __FIEventHandler_1_IInspectable_Release
#define IEventHandler_IInspectable_Invoke __FIEventHandler_1_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIEventHandler_1_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<HSTRING > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_HSTRING_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_HSTRING, 0xb79a741f, 0x7fb5, 0x50ae, 0x9e,0x99, 0x91,0x12,0x01,0xec,0x3d,0x41);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b79a741f-7fb5-50ae-9e99-911201ec3d41")
            IAsyncOperationCompletedHandler<HSTRING > : IAsyncOperationCompletedHandler_impl<HSTRING >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_HSTRING, 0xb79a741f, 0x7fb5, 0x50ae, 0x9e,0x99, 0x91,0x12,0x01,0xec,0x3d,0x41)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<HSTRING > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_HSTRING *This,
        __FIAsyncOperation_1_HSTRING *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_HSTRINGVtbl;

interface __FIAsyncOperationCompletedHandler_1_HSTRING {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<HSTRING > methods ***/
#define __FIAsyncOperationCompletedHandler_1_HSTRING_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_HSTRING_QueryInterface(__FIAsyncOperationCompletedHandler_1_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_HSTRING_AddRef(__FIAsyncOperationCompletedHandler_1_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_HSTRING_Release(__FIAsyncOperationCompletedHandler_1_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<HSTRING > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_HSTRING_Invoke(__FIAsyncOperationCompletedHandler_1_HSTRING* This,__FIAsyncOperation_1_HSTRING *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_HSTRING IID___FIAsyncOperationCompletedHandler_1_HSTRING
#define IAsyncOperationCompletedHandler_HSTRINGVtbl __FIAsyncOperationCompletedHandler_1_HSTRINGVtbl
#define IAsyncOperationCompletedHandler_HSTRING __FIAsyncOperationCompletedHandler_1_HSTRING
#define IAsyncOperationCompletedHandler_HSTRING_QueryInterface __FIAsyncOperationCompletedHandler_1_HSTRING_QueryInterface
#define IAsyncOperationCompletedHandler_HSTRING_AddRef __FIAsyncOperationCompletedHandler_1_HSTRING_AddRef
#define IAsyncOperationCompletedHandler_HSTRING_Release __FIAsyncOperationCompletedHandler_1_HSTRING_Release
#define IAsyncOperationCompletedHandler_HSTRING_Invoke __FIAsyncOperationCompletedHandler_1_HSTRING_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<IInspectable* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_IInspectable_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_IInspectable, 0x3f08262e, 0xa2e1, 0x5134, 0x92,0x97, 0xe9,0x21,0x1f,0x48,0x1a,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("3f08262e-a2e1-5134-9297-e9211f481a2d")
            IAsyncOperationCompletedHandler<IInspectable* > : IAsyncOperationCompletedHandler_impl<IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_IInspectable, 0x3f08262e, 0xa2e1, 0x5134, 0x92,0x97, 0xe9,0x21,0x1f,0x48,0x1a,0x2d)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_IInspectable *This,
        __FIAsyncOperation_1_IInspectable *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_IInspectableVtbl;

interface __FIAsyncOperationCompletedHandler_1_IInspectable {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<IInspectable* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_IInspectable_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_IInspectable_QueryInterface(__FIAsyncOperationCompletedHandler_1_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_IInspectable_AddRef(__FIAsyncOperationCompletedHandler_1_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_IInspectable_Release(__FIAsyncOperationCompletedHandler_1_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<IInspectable* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_IInspectable_Invoke(__FIAsyncOperationCompletedHandler_1_IInspectable* This,__FIAsyncOperation_1_IInspectable *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IInspectable IID___FIAsyncOperationCompletedHandler_1_IInspectable
#define IAsyncOperationCompletedHandler_IInspectableVtbl __FIAsyncOperationCompletedHandler_1_IInspectableVtbl
#define IAsyncOperationCompletedHandler_IInspectable __FIAsyncOperationCompletedHandler_1_IInspectable
#define IAsyncOperationCompletedHandler_IInspectable_QueryInterface __FIAsyncOperationCompletedHandler_1_IInspectable_QueryInterface
#define IAsyncOperationCompletedHandler_IInspectable_AddRef __FIAsyncOperationCompletedHandler_1_IInspectable_AddRef
#define IAsyncOperationCompletedHandler_IInspectable_Release __FIAsyncOperationCompletedHandler_1_IInspectable_Release
#define IAsyncOperationCompletedHandler_IInspectable_Invoke __FIAsyncOperationCompletedHandler_1_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<boolean > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_boolean_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_boolean_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_boolean, 0xc1d3d1a2, 0xae17, 0x5a5f, 0xb5,0xa2, 0xbd,0xcc,0x88,0x44,0x88,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c1d3d1a2-ae17-5a5f-b5a2-bdcc8844889a")
            IAsyncOperationCompletedHandler<boolean > : IAsyncOperationCompletedHandler_impl<boolean >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_boolean, 0xc1d3d1a2, 0xae17, 0x5a5f, 0xb5,0xa2, 0xbd,0xcc,0x88,0x44,0x88,0x9a)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_booleanVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<boolean > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_boolean *This,
        __FIAsyncOperation_1_boolean *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_booleanVtbl;

interface __FIAsyncOperationCompletedHandler_1_boolean {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_booleanVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_boolean_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_boolean_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_boolean_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<boolean > methods ***/
#define __FIAsyncOperationCompletedHandler_1_boolean_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_boolean_QueryInterface(__FIAsyncOperationCompletedHandler_1_boolean* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_boolean_AddRef(__FIAsyncOperationCompletedHandler_1_boolean* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_boolean_Release(__FIAsyncOperationCompletedHandler_1_boolean* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<boolean > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_boolean_Invoke(__FIAsyncOperationCompletedHandler_1_boolean* This,__FIAsyncOperation_1_boolean *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_boolean IID___FIAsyncOperationCompletedHandler_1_boolean
#define IAsyncOperationCompletedHandler_booleanVtbl __FIAsyncOperationCompletedHandler_1_booleanVtbl
#define IAsyncOperationCompletedHandler_boolean __FIAsyncOperationCompletedHandler_1_boolean
#define IAsyncOperationCompletedHandler_boolean_QueryInterface __FIAsyncOperationCompletedHandler_1_boolean_QueryInterface
#define IAsyncOperationCompletedHandler_boolean_AddRef __FIAsyncOperationCompletedHandler_1_boolean_AddRef
#define IAsyncOperationCompletedHandler_boolean_Release __FIAsyncOperationCompletedHandler_1_boolean_Release
#define IAsyncOperationCompletedHandler_boolean_Invoke __FIAsyncOperationCompletedHandler_1_boolean_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_boolean_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<UINT32 > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_UINT32_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_UINT32_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_UINT32, 0x9343b6e7, 0xe3d2, 0x5e4a, 0xab,0x2d, 0x2b,0xce,0x49,0x19,0xa6,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("9343b6e7-e3d2-5e4a-ab2d-2bce4919a6a4")
            IAsyncOperationCompletedHandler<UINT32 > : IAsyncOperationCompletedHandler_impl<UINT32 >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_UINT32, 0x9343b6e7, 0xe3d2, 0x5e4a, 0xab,0x2d, 0x2b,0xce,0x49,0x19,0xa6,0xa4)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_UINT32Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<UINT32 > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_UINT32 *This,
        __FIAsyncOperation_1_UINT32 *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_UINT32Vtbl;

interface __FIAsyncOperationCompletedHandler_1_UINT32 {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_UINT32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_UINT32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_UINT32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_UINT32_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<UINT32 > methods ***/
#define __FIAsyncOperationCompletedHandler_1_UINT32_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_UINT32_QueryInterface(__FIAsyncOperationCompletedHandler_1_UINT32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_UINT32_AddRef(__FIAsyncOperationCompletedHandler_1_UINT32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_UINT32_Release(__FIAsyncOperationCompletedHandler_1_UINT32* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<UINT32 > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_UINT32_Invoke(__FIAsyncOperationCompletedHandler_1_UINT32* This,__FIAsyncOperation_1_UINT32 *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_UINT32 IID___FIAsyncOperationCompletedHandler_1_UINT32
#define IAsyncOperationCompletedHandler_UINT32Vtbl __FIAsyncOperationCompletedHandler_1_UINT32Vtbl
#define IAsyncOperationCompletedHandler_UINT32 __FIAsyncOperationCompletedHandler_1_UINT32
#define IAsyncOperationCompletedHandler_UINT32_QueryInterface __FIAsyncOperationCompletedHandler_1_UINT32_QueryInterface
#define IAsyncOperationCompletedHandler_UINT32_AddRef __FIAsyncOperationCompletedHandler_1_UINT32_AddRef
#define IAsyncOperationCompletedHandler_UINT32_Release __FIAsyncOperationCompletedHandler_1_UINT32_Release
#define IAsyncOperationCompletedHandler_UINT32_Invoke __FIAsyncOperationCompletedHandler_1_UINT32_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_UINT32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Uri* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri, 0xad46f1cc, 0x2bb0, 0x585c, 0x98,0x85, 0x03,0xc2,0x78,0x0d,0x4d,0x58);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ad46f1cc-2bb0-585c-9885-03c2780d4d58")
            IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Uri* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Foundation::Uri*, ABI::Windows::Foundation::IUriRuntimeClass* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri, 0xad46f1cc, 0x2bb0, 0x585c, 0x98,0x85, 0x03,0xc2,0x78,0x0d,0x4d,0x58)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUriVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Uri* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri *This,
        __FIAsyncOperation_1_Windows__CFoundation__CUri *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUriVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUriVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Uri* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_Release(__FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Uri* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri* This,__FIAsyncOperation_1_Windows__CFoundation__CUri *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_Uri IID___FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri
#define IAsyncOperationCompletedHandler_UriVtbl __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUriVtbl
#define IAsyncOperationCompletedHandler_Uri __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri
#define IAsyncOperationCompletedHandler_Uri_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_QueryInterface
#define IAsyncOperationCompletedHandler_Uri_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_AddRef
#define IAsyncOperationCompletedHandler_Uri_Release __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_Release
#define IAsyncOperationCompletedHandler_Uri_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri_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 inline HRESULT __FIAsyncOperationProgressHandler_2_UINT32_UINT32_QueryInterface(__FIAsyncOperationProgressHandler_2_UINT32_UINT32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationProgressHandler_2_UINT32_UINT32_AddRef(__FIAsyncOperationProgressHandler_2_UINT32_UINT32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationProgressHandler_2_UINT32_UINT32_Release(__FIAsyncOperationProgressHandler_2_UINT32_UINT32* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationProgressHandler<UINT32,UINT32 > methods ***/
static 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 inline HRESULT __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_QueryInterface(__FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_AddRef(__FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32_Release(__FIAsyncOperationWithProgressCompletedHandler_2_UINT32_UINT32* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationWithProgressCompletedHandler<UINT32,UINT32 > methods ***/
static 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<HSTRING > interface
 */
#ifndef ____FIAsyncOperation_1_HSTRING_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_HSTRING_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_HSTRING, 0x3e1fe603, 0xf897, 0x5263, 0xb3,0x28, 0x08,0x06,0x42,0x6b,0x8a,0x79);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("3e1fe603-f897-5263-b328-0806426b8a79")
            IAsyncOperation<HSTRING > : IAsyncOperation_impl<HSTRING >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_HSTRING, 0x3e1fe603, 0xf897, 0x5263, 0xb3,0x28, 0x08,0x06,0x42,0x6b,0x8a,0x79)
#endif
#else
typedef struct __FIAsyncOperation_1_HSTRINGVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<HSTRING > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_HSTRING *This,
        __FIAsyncOperationCompletedHandler_1_HSTRING *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_HSTRING *This,
        __FIAsyncOperationCompletedHandler_1_HSTRING **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_HSTRING *This,
        HSTRING *results);

    END_INTERFACE
} __FIAsyncOperation_1_HSTRINGVtbl;

interface __FIAsyncOperation_1_HSTRING {
    CONST_VTBL __FIAsyncOperation_1_HSTRINGVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_HSTRING_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<HSTRING > methods ***/
#define __FIAsyncOperation_1_HSTRING_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_HSTRING_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_HSTRING_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_HSTRING_QueryInterface(__FIAsyncOperation_1_HSTRING* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_HSTRING_AddRef(__FIAsyncOperation_1_HSTRING* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_HSTRING_Release(__FIAsyncOperation_1_HSTRING* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_HSTRING_GetIids(__FIAsyncOperation_1_HSTRING* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_HSTRING_GetRuntimeClassName(__FIAsyncOperation_1_HSTRING* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_HSTRING_GetTrustLevel(__FIAsyncOperation_1_HSTRING* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<HSTRING > methods ***/
static inline HRESULT __FIAsyncOperation_1_HSTRING_put_Completed(__FIAsyncOperation_1_HSTRING* This,__FIAsyncOperationCompletedHandler_1_HSTRING *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_HSTRING_get_Completed(__FIAsyncOperation_1_HSTRING* This,__FIAsyncOperationCompletedHandler_1_HSTRING **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_HSTRING_GetResults(__FIAsyncOperation_1_HSTRING* This,HSTRING *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_HSTRING IID___FIAsyncOperation_1_HSTRING
#define IAsyncOperation_HSTRINGVtbl __FIAsyncOperation_1_HSTRINGVtbl
#define IAsyncOperation_HSTRING __FIAsyncOperation_1_HSTRING
#define IAsyncOperation_HSTRING_QueryInterface __FIAsyncOperation_1_HSTRING_QueryInterface
#define IAsyncOperation_HSTRING_AddRef __FIAsyncOperation_1_HSTRING_AddRef
#define IAsyncOperation_HSTRING_Release __FIAsyncOperation_1_HSTRING_Release
#define IAsyncOperation_HSTRING_GetIids __FIAsyncOperation_1_HSTRING_GetIids
#define IAsyncOperation_HSTRING_GetRuntimeClassName __FIAsyncOperation_1_HSTRING_GetRuntimeClassName
#define IAsyncOperation_HSTRING_GetTrustLevel __FIAsyncOperation_1_HSTRING_GetTrustLevel
#define IAsyncOperation_HSTRING_put_Completed __FIAsyncOperation_1_HSTRING_put_Completed
#define IAsyncOperation_HSTRING_get_Completed __FIAsyncOperation_1_HSTRING_get_Completed
#define IAsyncOperation_HSTRING_GetResults __FIAsyncOperation_1_HSTRING_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_HSTRING_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<IInspectable* > interface
 */
#ifndef ____FIAsyncOperation_1_IInspectable_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_IInspectable, 0xabf53c57, 0xee50, 0x5342, 0xb5,0x2a, 0x26,0xe3,0xb8,0xcc,0x02,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("abf53c57-ee50-5342-b52a-26e3b8cc024f")
            IAsyncOperation<IInspectable* > : IAsyncOperation_impl<IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_IInspectable, 0xabf53c57, 0xee50, 0x5342, 0xb5,0x2a, 0x26,0xe3,0xb8,0xcc,0x02,0x4f)
#endif
#else
typedef struct __FIAsyncOperation_1_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_IInspectable *This,
        __FIAsyncOperationCompletedHandler_1_IInspectable *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_IInspectable *This,
        __FIAsyncOperationCompletedHandler_1_IInspectable **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_IInspectable *This,
        IInspectable **results);

    END_INTERFACE
} __FIAsyncOperation_1_IInspectableVtbl;

interface __FIAsyncOperation_1_IInspectable {
    CONST_VTBL __FIAsyncOperation_1_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_IInspectable_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_IInspectable_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_IInspectable_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<IInspectable* > methods ***/
#define __FIAsyncOperation_1_IInspectable_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_IInspectable_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_IInspectable_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_IInspectable_QueryInterface(__FIAsyncOperation_1_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_IInspectable_AddRef(__FIAsyncOperation_1_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_IInspectable_Release(__FIAsyncOperation_1_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_IInspectable_GetIids(__FIAsyncOperation_1_IInspectable* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_IInspectable_GetRuntimeClassName(__FIAsyncOperation_1_IInspectable* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_IInspectable_GetTrustLevel(__FIAsyncOperation_1_IInspectable* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<IInspectable* > methods ***/
static inline HRESULT __FIAsyncOperation_1_IInspectable_put_Completed(__FIAsyncOperation_1_IInspectable* This,__FIAsyncOperationCompletedHandler_1_IInspectable *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_IInspectable_get_Completed(__FIAsyncOperation_1_IInspectable* This,__FIAsyncOperationCompletedHandler_1_IInspectable **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_IInspectable_GetResults(__FIAsyncOperation_1_IInspectable* This,IInspectable **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IInspectable IID___FIAsyncOperation_1_IInspectable
#define IAsyncOperation_IInspectableVtbl __FIAsyncOperation_1_IInspectableVtbl
#define IAsyncOperation_IInspectable __FIAsyncOperation_1_IInspectable
#define IAsyncOperation_IInspectable_QueryInterface __FIAsyncOperation_1_IInspectable_QueryInterface
#define IAsyncOperation_IInspectable_AddRef __FIAsyncOperation_1_IInspectable_AddRef
#define IAsyncOperation_IInspectable_Release __FIAsyncOperation_1_IInspectable_Release
#define IAsyncOperation_IInspectable_GetIids __FIAsyncOperation_1_IInspectable_GetIids
#define IAsyncOperation_IInspectable_GetRuntimeClassName __FIAsyncOperation_1_IInspectable_GetRuntimeClassName
#define IAsyncOperation_IInspectable_GetTrustLevel __FIAsyncOperation_1_IInspectable_GetTrustLevel
#define IAsyncOperation_IInspectable_put_Completed __FIAsyncOperation_1_IInspectable_put_Completed
#define IAsyncOperation_IInspectable_get_Completed __FIAsyncOperation_1_IInspectable_get_Completed
#define IAsyncOperation_IInspectable_GetResults __FIAsyncOperation_1_IInspectable_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<boolean > interface
 */
#ifndef ____FIAsyncOperation_1_boolean_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_boolean_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_boolean, 0xcdb5efb3, 0x5788, 0x509d, 0x9b,0xe1, 0x71,0xcc,0xb8,0xa3,0x36,0x2a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("cdb5efb3-5788-509d-9be1-71ccb8a3362a")
            IAsyncOperation<boolean > : IAsyncOperation_impl<boolean >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_boolean, 0xcdb5efb3, 0x5788, 0x509d, 0x9b,0xe1, 0x71,0xcc,0xb8,0xa3,0x36,0x2a)
#endif
#else
typedef struct __FIAsyncOperation_1_booleanVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<boolean > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_boolean *This,
        __FIAsyncOperationCompletedHandler_1_boolean *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_boolean *This,
        __FIAsyncOperationCompletedHandler_1_boolean **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_boolean *This,
        boolean *results);

    END_INTERFACE
} __FIAsyncOperation_1_booleanVtbl;

interface __FIAsyncOperation_1_boolean {
    CONST_VTBL __FIAsyncOperation_1_booleanVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_boolean_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_boolean_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_boolean_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_boolean_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_boolean_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_boolean_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<boolean > methods ***/
#define __FIAsyncOperation_1_boolean_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_boolean_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_boolean_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_boolean_QueryInterface(__FIAsyncOperation_1_boolean* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_boolean_AddRef(__FIAsyncOperation_1_boolean* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_boolean_Release(__FIAsyncOperation_1_boolean* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_boolean_GetIids(__FIAsyncOperation_1_boolean* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_boolean_GetRuntimeClassName(__FIAsyncOperation_1_boolean* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_boolean_GetTrustLevel(__FIAsyncOperation_1_boolean* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<boolean > methods ***/
static inline HRESULT __FIAsyncOperation_1_boolean_put_Completed(__FIAsyncOperation_1_boolean* This,__FIAsyncOperationCompletedHandler_1_boolean *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_boolean_get_Completed(__FIAsyncOperation_1_boolean* This,__FIAsyncOperationCompletedHandler_1_boolean **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_boolean_GetResults(__FIAsyncOperation_1_boolean* This,boolean *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_boolean IID___FIAsyncOperation_1_boolean
#define IAsyncOperation_booleanVtbl __FIAsyncOperation_1_booleanVtbl
#define IAsyncOperation_boolean __FIAsyncOperation_1_boolean
#define IAsyncOperation_boolean_QueryInterface __FIAsyncOperation_1_boolean_QueryInterface
#define IAsyncOperation_boolean_AddRef __FIAsyncOperation_1_boolean_AddRef
#define IAsyncOperation_boolean_Release __FIAsyncOperation_1_boolean_Release
#define IAsyncOperation_boolean_GetIids __FIAsyncOperation_1_boolean_GetIids
#define IAsyncOperation_boolean_GetRuntimeClassName __FIAsyncOperation_1_boolean_GetRuntimeClassName
#define IAsyncOperation_boolean_GetTrustLevel __FIAsyncOperation_1_boolean_GetTrustLevel
#define IAsyncOperation_boolean_put_Completed __FIAsyncOperation_1_boolean_put_Completed
#define IAsyncOperation_boolean_get_Completed __FIAsyncOperation_1_boolean_get_Completed
#define IAsyncOperation_boolean_GetResults __FIAsyncOperation_1_boolean_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_boolean_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<UINT32 > interface
 */
#ifndef ____FIAsyncOperation_1_UINT32_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_UINT32_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_UINT32, 0xef60385f, 0xbe78, 0x584b, 0xaa,0xef, 0x78,0x29,0xad,0xa2,0xb0,0xde);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ef60385f-be78-584b-aaef-7829ada2b0de")
            IAsyncOperation<UINT32 > : IAsyncOperation_impl<UINT32 >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_UINT32, 0xef60385f, 0xbe78, 0x584b, 0xaa,0xef, 0x78,0x29,0xad,0xa2,0xb0,0xde)
#endif
#else
typedef struct __FIAsyncOperation_1_UINT32Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<UINT32 > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_UINT32 *This,
        __FIAsyncOperationCompletedHandler_1_UINT32 *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_UINT32 *This,
        __FIAsyncOperationCompletedHandler_1_UINT32 **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_UINT32 *This,
        UINT32 *results);

    END_INTERFACE
} __FIAsyncOperation_1_UINT32Vtbl;

interface __FIAsyncOperation_1_UINT32 {
    CONST_VTBL __FIAsyncOperation_1_UINT32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_UINT32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_UINT32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_UINT32_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_UINT32_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_UINT32_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_UINT32_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<UINT32 > methods ***/
#define __FIAsyncOperation_1_UINT32_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_UINT32_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_UINT32_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_UINT32_QueryInterface(__FIAsyncOperation_1_UINT32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_UINT32_AddRef(__FIAsyncOperation_1_UINT32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_UINT32_Release(__FIAsyncOperation_1_UINT32* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_UINT32_GetIids(__FIAsyncOperation_1_UINT32* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_UINT32_GetRuntimeClassName(__FIAsyncOperation_1_UINT32* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_UINT32_GetTrustLevel(__FIAsyncOperation_1_UINT32* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<UINT32 > methods ***/
static inline HRESULT __FIAsyncOperation_1_UINT32_put_Completed(__FIAsyncOperation_1_UINT32* This,__FIAsyncOperationCompletedHandler_1_UINT32 *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_UINT32_get_Completed(__FIAsyncOperation_1_UINT32* This,__FIAsyncOperationCompletedHandler_1_UINT32 **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_UINT32_GetResults(__FIAsyncOperation_1_UINT32* This,UINT32 *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_UINT32 IID___FIAsyncOperation_1_UINT32
#define IAsyncOperation_UINT32Vtbl __FIAsyncOperation_1_UINT32Vtbl
#define IAsyncOperation_UINT32 __FIAsyncOperation_1_UINT32
#define IAsyncOperation_UINT32_QueryInterface __FIAsyncOperation_1_UINT32_QueryInterface
#define IAsyncOperation_UINT32_AddRef __FIAsyncOperation_1_UINT32_AddRef
#define IAsyncOperation_UINT32_Release __FIAsyncOperation_1_UINT32_Release
#define IAsyncOperation_UINT32_GetIids __FIAsyncOperation_1_UINT32_GetIids
#define IAsyncOperation_UINT32_GetRuntimeClassName __FIAsyncOperation_1_UINT32_GetRuntimeClassName
#define IAsyncOperation_UINT32_GetTrustLevel __FIAsyncOperation_1_UINT32_GetTrustLevel
#define IAsyncOperation_UINT32_put_Completed __FIAsyncOperation_1_UINT32_put_Completed
#define IAsyncOperation_UINT32_get_Completed __FIAsyncOperation_1_UINT32_get_Completed
#define IAsyncOperation_UINT32_GetResults __FIAsyncOperation_1_UINT32_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_UINT32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Foundation::Uri* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CFoundation__CUri_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CFoundation__CUri, 0x641cb9dd, 0xa28d, 0x59e2, 0xb8,0xdb, 0xa2,0x27,0xed,0xa6,0xcf,0x2e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("641cb9dd-a28d-59e2-b8db-a227eda6cf2e")
            IAsyncOperation<ABI::Windows::Foundation::Uri* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Foundation::Uri*, ABI::Windows::Foundation::IUriRuntimeClass* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CFoundation__CUri, 0x641cb9dd, 0xa28d, 0x59e2, 0xb8,0xdb, 0xa2,0x27,0xed,0xa6,0xcf,0x2e)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CFoundation__CUriVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Foundation::Uri* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CFoundation__CUri *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CFoundation__CUri *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CFoundation__CUri *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CFoundation__CUriVtbl;

interface __FIAsyncOperation_1_Windows__CFoundation__CUri {
    CONST_VTBL __FIAsyncOperation_1_Windows__CFoundation__CUriVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CFoundation__CUri_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CFoundation__CUri_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CFoundation__CUri_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CFoundation__CUri_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CFoundation__CUri_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CFoundation__CUri_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Foundation::Uri* > methods ***/
#define __FIAsyncOperation_1_Windows__CFoundation__CUri_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CFoundation__CUri_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CFoundation__CUri_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CFoundation__CUri_QueryInterface(__FIAsyncOperation_1_Windows__CFoundation__CUri* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CFoundation__CUri_AddRef(__FIAsyncOperation_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CFoundation__CUri_Release(__FIAsyncOperation_1_Windows__CFoundation__CUri* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CFoundation__CUri_GetIids(__FIAsyncOperation_1_Windows__CFoundation__CUri* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CFoundation__CUri_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CFoundation__CUri* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CFoundation__CUri_GetTrustLevel(__FIAsyncOperation_1_Windows__CFoundation__CUri* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Foundation::Uri* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CFoundation__CUri_put_Completed(__FIAsyncOperation_1_Windows__CFoundation__CUri* This,__FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CFoundation__CUri_get_Completed(__FIAsyncOperation_1_Windows__CFoundation__CUri* This,__FIAsyncOperationCompletedHandler_1_Windows__CFoundation__CUri **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CFoundation__CUri_GetResults(__FIAsyncOperation_1_Windows__CFoundation__CUri* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_Uri IID___FIAsyncOperation_1_Windows__CFoundation__CUri
#define IAsyncOperation_UriVtbl __FIAsyncOperation_1_Windows__CFoundation__CUriVtbl
#define IAsyncOperation_Uri __FIAsyncOperation_1_Windows__CFoundation__CUri
#define IAsyncOperation_Uri_QueryInterface __FIAsyncOperation_1_Windows__CFoundation__CUri_QueryInterface
#define IAsyncOperation_Uri_AddRef __FIAsyncOperation_1_Windows__CFoundation__CUri_AddRef
#define IAsyncOperation_Uri_Release __FIAsyncOperation_1_Windows__CFoundation__CUri_Release
#define IAsyncOperation_Uri_GetIids __FIAsyncOperation_1_Windows__CFoundation__CUri_GetIids
#define IAsyncOperation_Uri_GetRuntimeClassName __FIAsyncOperation_1_Windows__CFoundation__CUri_GetRuntimeClassName
#define IAsyncOperation_Uri_GetTrustLevel __FIAsyncOperation_1_Windows__CFoundation__CUri_GetTrustLevel
#define IAsyncOperation_Uri_put_Completed __FIAsyncOperation_1_Windows__CFoundation__CUri_put_Completed
#define IAsyncOperation_Uri_get_Completed __FIAsyncOperation_1_Windows__CFoundation__CUri_get_Completed
#define IAsyncOperation_Uri_GetResults __FIAsyncOperation_1_Windows__CFoundation__CUri_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CFoundation__CUri_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 inline HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_QueryInterface(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationWithProgress_2_UINT32_UINT32_AddRef(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationWithProgress_2_UINT32_UINT32_Release(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetIids(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperationWithProgress_2_UINT32_UINT32_GetRuntimeClassName(__FIAsyncOperationWithProgress_2_UINT32_UINT32* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static 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 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 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 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 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 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__
#define ____FIReference_1_BYTE_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_BYTE, 0xe5198cc8, 0x2873, 0x55f5, 0xb0,0xa1, 0x84,0xff,0x9e,0x4a,0xad,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("e5198cc8-2873-55f5-b0a1-84ff9e4aad62")
            IReference<BYTE > : IReference_impl<BYTE >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_BYTE, 0xe5198cc8, 0x2873, 0x55f5, 0xb0,0xa1, 0x84,0xff,0x9e,0x4a,0xad,0x62)
#endif
#else
typedef struct __FIReference_1_BYTEVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IReference<BYTE > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_BYTE *This,
        BYTE *value);

    END_INTERFACE
} __FIReference_1_BYTEVtbl;

interface __FIReference_1_BYTE {
    CONST_VTBL __FIReference_1_BYTEVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_BYTE_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_BYTE_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_BYTE_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_BYTE_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_BYTE_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_BYTE_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<BYTE > methods ***/
#define __FIReference_1_BYTE_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_BYTE_QueryInterface(__FIReference_1_BYTE* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_BYTE_AddRef(__FIReference_1_BYTE* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_BYTE_Release(__FIReference_1_BYTE* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_BYTE_GetIids(__FIReference_1_BYTE* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_BYTE_GetRuntimeClassName(__FIReference_1_BYTE* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_BYTE_GetTrustLevel(__FIReference_1_BYTE* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<BYTE > methods ***/
static inline HRESULT __FIReference_1_BYTE_get_Value(__FIReference_1_BYTE* This,BYTE *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_BYTE IID___FIReference_1_BYTE
#define IReference_BYTEVtbl __FIReference_1_BYTEVtbl
#define IReference_BYTE __FIReference_1_BYTE
#define IReference_BYTE_QueryInterface __FIReference_1_BYTE_QueryInterface
#define IReference_BYTE_AddRef __FIReference_1_BYTE_AddRef
#define IReference_BYTE_Release __FIReference_1_BYTE_Release
#define IReference_BYTE_GetIids __FIReference_1_BYTE_GetIids
#define IReference_BYTE_GetRuntimeClassName __FIReference_1_BYTE_GetRuntimeClassName
#define IReference_BYTE_GetTrustLevel __FIReference_1_BYTE_GetTrustLevel
#define IReference_BYTE_get_Value __FIReference_1_BYTE_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_BYTE_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<DOUBLE > interface
 */
#ifndef ____FIReference_1_DOUBLE_INTERFACE_DEFINED__
#define ____FIReference_1_DOUBLE_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_DOUBLE, 0x2f2d6c29, 0x5473, 0x5f3e, 0x92,0xe7, 0x96,0x57,0x2b,0xb9,0x90,0xe2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("2f2d6c29-5473-5f3e-92e7-96572bb990e2")
            IReference<DOUBLE > : IReference_impl<DOUBLE >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_DOUBLE, 0x2f2d6c29, 0x5473, 0x5f3e, 0x92,0xe7, 0x96,0x57,0x2b,0xb9,0x90,0xe2)
#endif
#else
typedef struct __FIReference_1_DOUBLEVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IReference<DOUBLE > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_DOUBLE *This,
        DOUBLE *value);

    END_INTERFACE
} __FIReference_1_DOUBLEVtbl;

interface __FIReference_1_DOUBLE {
    CONST_VTBL __FIReference_1_DOUBLEVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_DOUBLE_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_DOUBLE_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_DOUBLE_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_DOUBLE_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_DOUBLE_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_DOUBLE_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<DOUBLE > methods ***/
#define __FIReference_1_DOUBLE_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_DOUBLE_QueryInterface(__FIReference_1_DOUBLE* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_DOUBLE_AddRef(__FIReference_1_DOUBLE* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_DOUBLE_Release(__FIReference_1_DOUBLE* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_DOUBLE_GetIids(__FIReference_1_DOUBLE* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_DOUBLE_GetRuntimeClassName(__FIReference_1_DOUBLE* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_DOUBLE_GetTrustLevel(__FIReference_1_DOUBLE* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<DOUBLE > methods ***/
static inline HRESULT __FIReference_1_DOUBLE_get_Value(__FIReference_1_DOUBLE* This,DOUBLE *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_DOUBLE IID___FIReference_1_DOUBLE
#define IReference_DOUBLEVtbl __FIReference_1_DOUBLEVtbl
#define IReference_DOUBLE __FIReference_1_DOUBLE
#define IReference_DOUBLE_QueryInterface __FIReference_1_DOUBLE_QueryInterface
#define IReference_DOUBLE_AddRef __FIReference_1_DOUBLE_AddRef
#define IReference_DOUBLE_Release __FIReference_1_DOUBLE_Release
#define IReference_DOUBLE_GetIids __FIReference_1_DOUBLE_GetIids
#define IReference_DOUBLE_GetRuntimeClassName __FIReference_1_DOUBLE_GetRuntimeClassName
#define IReference_DOUBLE_GetTrustLevel __FIReference_1_DOUBLE_GetTrustLevel
#define IReference_DOUBLE_get_Value __FIReference_1_DOUBLE_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_DOUBLE_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<FLOAT > interface
 */
#ifndef ____FIReference_1_FLOAT_INTERFACE_DEFINED__
#define ____FIReference_1_FLOAT_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_FLOAT, 0x719cc2ba, 0x3e76, 0x5def, 0x9f,0x1a, 0x38,0xd8,0x5a,0x14,0x5e,0xa8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("719cc2ba-3e76-5def-9f1a-38d85a145ea8")
            IReference<FLOAT > : IReference_impl<FLOAT >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_FLOAT, 0x719cc2ba, 0x3e76, 0x5def, 0x9f,0x1a, 0x38,0xd8,0x5a,0x14,0x5e,0xa8)
#endif
#else
typedef struct __FIReference_1_FLOATVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IReference<FLOAT > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_FLOAT *This,
        FLOAT *value);

    END_INTERFACE
} __FIReference_1_FLOATVtbl;

interface __FIReference_1_FLOAT {
    CONST_VTBL __FIReference_1_FLOATVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_FLOAT_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_FLOAT_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_FLOAT_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_FLOAT_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_FLOAT_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_FLOAT_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<FLOAT > methods ***/
#define __FIReference_1_FLOAT_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_FLOAT_QueryInterface(__FIReference_1_FLOAT* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_FLOAT_AddRef(__FIReference_1_FLOAT* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_FLOAT_Release(__FIReference_1_FLOAT* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_FLOAT_GetIids(__FIReference_1_FLOAT* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_FLOAT_GetRuntimeClassName(__FIReference_1_FLOAT* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_FLOAT_GetTrustLevel(__FIReference_1_FLOAT* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<FLOAT > methods ***/
static inline HRESULT __FIReference_1_FLOAT_get_Value(__FIReference_1_FLOAT* This,FLOAT *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_FLOAT IID___FIReference_1_FLOAT
#define IReference_FLOATVtbl __FIReference_1_FLOATVtbl
#define IReference_FLOAT __FIReference_1_FLOAT
#define IReference_FLOAT_QueryInterface __FIReference_1_FLOAT_QueryInterface
#define IReference_FLOAT_AddRef __FIReference_1_FLOAT_AddRef
#define IReference_FLOAT_Release __FIReference_1_FLOAT_Release
#define IReference_FLOAT_GetIids __FIReference_1_FLOAT_GetIids
#define IReference_FLOAT_GetRuntimeClassName __FIReference_1_FLOAT_GetRuntimeClassName
#define IReference_FLOAT_GetTrustLevel __FIReference_1_FLOAT_GetTrustLevel
#define IReference_FLOAT_get_Value __FIReference_1_FLOAT_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#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 inline HRESULT __FIReference_1_GUID_QueryInterface(__FIReference_1_GUID* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_GUID_AddRef(__FIReference_1_GUID* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_GUID_Release(__FIReference_1_GUID* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_GUID_GetIids(__FIReference_1_GUID* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_GUID_GetRuntimeClassName(__FIReference_1_GUID* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_GUID_GetTrustLevel(__FIReference_1_GUID* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<GUID > methods ***/
static 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 inline HRESULT __FIReference_1_INT16_QueryInterface(__FIReference_1_INT16* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_INT16_AddRef(__FIReference_1_INT16* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_INT16_Release(__FIReference_1_INT16* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_INT16_GetIids(__FIReference_1_INT16* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_INT16_GetRuntimeClassName(__FIReference_1_INT16* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_INT16_GetTrustLevel(__FIReference_1_INT16* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<INT16 > methods ***/
static 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 inline HRESULT __FIReference_1_INT32_QueryInterface(__FIReference_1_INT32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_INT32_AddRef(__FIReference_1_INT32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_INT32_Release(__FIReference_1_INT32* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_INT32_GetIids(__FIReference_1_INT32* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_INT32_GetRuntimeClassName(__FIReference_1_INT32* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_INT32_GetTrustLevel(__FIReference_1_INT32* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<INT32 > methods ***/
static 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 inline HRESULT __FIReference_1_INT64_QueryInterface(__FIReference_1_INT64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_INT64_AddRef(__FIReference_1_INT64* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_INT64_Release(__FIReference_1_INT64* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_INT64_GetIids(__FIReference_1_INT64* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_INT64_GetRuntimeClassName(__FIReference_1_INT64* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_INT64_GetTrustLevel(__FIReference_1_INT64* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<INT64 > methods ***/
static 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__
#define ____FIReference_1_UINT32_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_UINT32, 0x513ef3af, 0xe784, 0x5325, 0xa9,0x1e, 0x97,0xc2,0xb8,0x11,0x1c,0xf3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("513ef3af-e784-5325-a91e-97c2b8111cf3")
            IReference<UINT32 > : IReference_impl<UINT32 >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_UINT32, 0x513ef3af, 0xe784, 0x5325, 0xa9,0x1e, 0x97,0xc2,0xb8,0x11,0x1c,0xf3)
#endif
#else
typedef struct __FIReference_1_UINT32Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IReference<UINT32 > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_UINT32 *This,
        UINT32 *value);

    END_INTERFACE
} __FIReference_1_UINT32Vtbl;

interface __FIReference_1_UINT32 {
    CONST_VTBL __FIReference_1_UINT32Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_UINT32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_UINT32_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_UINT32_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_UINT32_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_UINT32_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_UINT32_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<UINT32 > methods ***/
#define __FIReference_1_UINT32_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_UINT32_QueryInterface(__FIReference_1_UINT32* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_UINT32_AddRef(__FIReference_1_UINT32* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_UINT32_Release(__FIReference_1_UINT32* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_UINT32_GetIids(__FIReference_1_UINT32* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_UINT32_GetRuntimeClassName(__FIReference_1_UINT32* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_UINT32_GetTrustLevel(__FIReference_1_UINT32* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<UINT32 > methods ***/
static inline HRESULT __FIReference_1_UINT32_get_Value(__FIReference_1_UINT32* This,UINT32 *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_UINT32 IID___FIReference_1_UINT32
#define IReference_UINT32Vtbl __FIReference_1_UINT32Vtbl
#define IReference_UINT32 __FIReference_1_UINT32
#define IReference_UINT32_QueryInterface __FIReference_1_UINT32_QueryInterface
#define IReference_UINT32_AddRef __FIReference_1_UINT32_AddRef
#define IReference_UINT32_Release __FIReference_1_UINT32_Release
#define IReference_UINT32_GetIids __FIReference_1_UINT32_GetIids
#define IReference_UINT32_GetRuntimeClassName __FIReference_1_UINT32_GetRuntimeClassName
#define IReference_UINT32_GetTrustLevel __FIReference_1_UINT32_GetTrustLevel
#define IReference_UINT32_get_Value __FIReference_1_UINT32_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_UINT32_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<UINT64 > interface
 */
#ifndef ____FIReference_1_UINT64_INTERFACE_DEFINED__
#define ____FIReference_1_UINT64_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_UINT64, 0x6755e376, 0x53bb, 0x568b, 0xa1,0x1d, 0x17,0x23,0x98,0x68,0x30,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("6755e376-53bb-568b-a11d-17239868309e")
            IReference<UINT64 > : IReference_impl<UINT64 >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_UINT64, 0x6755e376, 0x53bb, 0x568b, 0xa1,0x1d, 0x17,0x23,0x98,0x68,0x30,0x9e)
#endif
#else
typedef struct __FIReference_1_UINT64Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IReference<UINT64 > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_UINT64 *This,
        UINT64 *value);

    END_INTERFACE
} __FIReference_1_UINT64Vtbl;

interface __FIReference_1_UINT64 {
    CONST_VTBL __FIReference_1_UINT64Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_UINT64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_UINT64_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_UINT64_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_UINT64_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_UINT64_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_UINT64_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<UINT64 > methods ***/
#define __FIReference_1_UINT64_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_UINT64_QueryInterface(__FIReference_1_UINT64* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_UINT64_AddRef(__FIReference_1_UINT64* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_UINT64_Release(__FIReference_1_UINT64* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_UINT64_GetIids(__FIReference_1_UINT64* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_UINT64_GetRuntimeClassName(__FIReference_1_UINT64* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_UINT64_GetTrustLevel(__FIReference_1_UINT64* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<UINT64 > methods ***/
static inline HRESULT __FIReference_1_UINT64_get_Value(__FIReference_1_UINT64* This,UINT64 *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_UINT64 IID___FIReference_1_UINT64
#define IReference_UINT64Vtbl __FIReference_1_UINT64Vtbl
#define IReference_UINT64 __FIReference_1_UINT64
#define IReference_UINT64_QueryInterface __FIReference_1_UINT64_QueryInterface
#define IReference_UINT64_AddRef __FIReference_1_UINT64_AddRef
#define IReference_UINT64_Release __FIReference_1_UINT64_Release
#define IReference_UINT64_GetIids __FIReference_1_UINT64_GetIids
#define IReference_UINT64_GetRuntimeClassName __FIReference_1_UINT64_GetRuntimeClassName
#define IReference_UINT64_GetTrustLevel __FIReference_1_UINT64_GetTrustLevel
#define IReference_UINT64_get_Value __FIReference_1_UINT64_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_UINT64_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::Foundation::DateTime > interface
 */
#ifndef ____FIReference_1_DateTime_INTERFACE_DEFINED__
#define ____FIReference_1_DateTime_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_DateTime, 0x5541d8a7, 0x497c, 0x5aa4, 0x86,0xfc, 0x77,0x13,0xad,0xbf,0x2a,0x2c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("5541d8a7-497c-5aa4-86fc-7713adbf2a2c")
            IReference<ABI::Windows::Foundation::DateTime > : IReference_impl<ABI::Windows::Foundation::DateTime >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_DateTime, 0x5541d8a7, 0x497c, 0x5aa4, 0x86,0xfc, 0x77,0x13,0xad,0xbf,0x2a,0x2c)
#endif
#else
typedef struct __FIReference_1_DateTimeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IReference<ABI::Windows::Foundation::DateTime > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_DateTime *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    END_INTERFACE
} __FIReference_1_DateTimeVtbl;

interface __FIReference_1_DateTime {
    CONST_VTBL __FIReference_1_DateTimeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_DateTime_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_DateTime_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_DateTime_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_DateTime_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_DateTime_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_DateTime_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::Foundation::DateTime > methods ***/
#define __FIReference_1_DateTime_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_DateTime_QueryInterface(__FIReference_1_DateTime* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_DateTime_AddRef(__FIReference_1_DateTime* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_DateTime_Release(__FIReference_1_DateTime* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_DateTime_GetIids(__FIReference_1_DateTime* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_DateTime_GetRuntimeClassName(__FIReference_1_DateTime* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_DateTime_GetTrustLevel(__FIReference_1_DateTime* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::Foundation::DateTime > methods ***/
static inline HRESULT __FIReference_1_DateTime_get_Value(__FIReference_1_DateTime* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_DateTime IID___FIReference_1_DateTime
#define IReference_DateTimeVtbl __FIReference_1_DateTimeVtbl
#define IReference_DateTime __FIReference_1_DateTime
#define IReference_DateTime_QueryInterface __FIReference_1_DateTime_QueryInterface
#define IReference_DateTime_AddRef __FIReference_1_DateTime_AddRef
#define IReference_DateTime_Release __FIReference_1_DateTime_Release
#define IReference_DateTime_GetIids __FIReference_1_DateTime_GetIids
#define IReference_DateTime_GetRuntimeClassName __FIReference_1_DateTime_GetRuntimeClassName
#define IReference_DateTime_GetTrustLevel __FIReference_1_DateTime_GetTrustLevel
#define IReference_DateTime_get_Value __FIReference_1_DateTime_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#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 inline HRESULT __FIReference_1_Point_QueryInterface(__FIReference_1_Point* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_Point_AddRef(__FIReference_1_Point* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_Point_Release(__FIReference_1_Point* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_Point_GetIids(__FIReference_1_Point* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_Point_GetRuntimeClassName(__FIReference_1_Point* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static 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 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 inline HRESULT __FIReference_1_Rect_QueryInterface(__FIReference_1_Rect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_Rect_AddRef(__FIReference_1_Rect* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_Rect_Release(__FIReference_1_Rect* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_Rect_GetIids(__FIReference_1_Rect* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_Rect_GetRuntimeClassName(__FIReference_1_Rect* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static 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 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 inline HRESULT __FIReference_1_Size_QueryInterface(__FIReference_1_Size* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_Size_AddRef(__FIReference_1_Size* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_Size_Release(__FIReference_1_Size* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_Size_GetIids(__FIReference_1_Size* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_Size_GetRuntimeClassName(__FIReference_1_Size* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static 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 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 inline HRESULT __FIReference_1_TimeSpan_QueryInterface(__FIReference_1_TimeSpan* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_TimeSpan_AddRef(__FIReference_1_TimeSpan* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_TimeSpan_Release(__FIReference_1_TimeSpan* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_TimeSpan_GetIids(__FIReference_1_TimeSpan* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_TimeSpan_GetRuntimeClassName(__FIReference_1_TimeSpan* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static 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 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 inline HRESULT __FIReference_1_boolean_QueryInterface(__FIReference_1_boolean* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_boolean_AddRef(__FIReference_1_boolean* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_boolean_Release(__FIReference_1_boolean* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_boolean_GetIids(__FIReference_1_boolean* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_boolean_GetRuntimeClassName(__FIReference_1_boolean* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_boolean_GetTrustLevel(__FIReference_1_boolean* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<boolean > methods ***/
static 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__
#define ____FITypedEventHandler_2_IInspectable_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_IInspectable_IInspectable, 0xc7e65ce2, 0xfad5, 0x5e3b, 0x9c,0x58, 0x18,0x6c,0xa8,0xc1,0xdd,0x57);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c7e65ce2-fad5-5e3b-9c58-186ca8c1dd57")
            ITypedEventHandler<IInspectable*,IInspectable* > : ITypedEventHandler_impl<IInspectable*, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_IInspectable_IInspectable, 0xc7e65ce2, 0xfad5, 0x5e3b, 0x9c,0x58, 0x18,0x6c,0xa8,0xc1,0xdd,0x57)
#endif
#else
typedef struct __FITypedEventHandler_2_IInspectable_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<IInspectable*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_IInspectable_IInspectable *This,
        IInspectable *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_IInspectable_IInspectableVtbl;

interface __FITypedEventHandler_2_IInspectable_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_IInspectable_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_IInspectable_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_IInspectable_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_IInspectable_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<IInspectable*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_IInspectable_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_IInspectable_IInspectable_QueryInterface(__FITypedEventHandler_2_IInspectable_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_IInspectable_IInspectable_AddRef(__FITypedEventHandler_2_IInspectable_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_IInspectable_IInspectable_Release(__FITypedEventHandler_2_IInspectable_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<IInspectable*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_IInspectable_IInspectable_Invoke(__FITypedEventHandler_2_IInspectable_IInspectable* This,IInspectable *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_IInspectable_IInspectable IID___FITypedEventHandler_2_IInspectable_IInspectable
#define ITypedEventHandler_IInspectable_IInspectableVtbl __FITypedEventHandler_2_IInspectable_IInspectableVtbl
#define ITypedEventHandler_IInspectable_IInspectable __FITypedEventHandler_2_IInspectable_IInspectable
#define ITypedEventHandler_IInspectable_IInspectable_QueryInterface __FITypedEventHandler_2_IInspectable_IInspectable_QueryInterface
#define ITypedEventHandler_IInspectable_IInspectable_AddRef __FITypedEventHandler_2_IInspectable_IInspectable_AddRef
#define ITypedEventHandler_IInspectable_IInspectable_Release __FITypedEventHandler_2_IInspectable_IInspectable_Release
#define ITypedEventHandler_IInspectable_IInspectable_Invoke __FITypedEventHandler_2_IInspectable_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_IInspectable_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Foundation::IMemoryBufferReference*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable, 0xf4637d4a, 0x0760, 0x5431, 0xbf,0xc0, 0x24,0xeb,0x1d,0x4f,0x6c,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f4637d4a-0760-5431-bfc0-24eb1d4f6c4f")
            ITypedEventHandler<ABI::Windows::Foundation::IMemoryBufferReference*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::IMemoryBufferReference*, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable, 0xf4637d4a, 0x0760, 0x5431, 0xbf,0xc0, 0x24,0xeb,0x1d,0x4f,0x6c,0x4f)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Foundation::IMemoryBufferReference*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable *This,
        __x_ABI_CWindows_CFoundation_CIMemoryBufferReference *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Foundation::IMemoryBufferReference*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_Release(__FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Foundation::IMemoryBufferReference*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable* This,__x_ABI_CWindows_CFoundation_CIMemoryBufferReference *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_IMemoryBufferReference_IInspectable IID___FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable
#define ITypedEventHandler_IMemoryBufferReference_IInspectableVtbl __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectableVtbl
#define ITypedEventHandler_IMemoryBufferReference_IInspectable __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable
#define ITypedEventHandler_IMemoryBufferReference_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_QueryInterface
#define ITypedEventHandler_IMemoryBufferReference_IInspectable_AddRef __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_AddRef
#define ITypedEventHandler_IMemoryBufferReference_IInspectable_Release __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_Release
#define ITypedEventHandler_IMemoryBufferReference_IInspectable_Invoke __FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CFoundation__CIMemoryBufferReference_IInspectable_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_foundation_h__ */
