/*
 * Copyright 2015 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "asyncinfo.idl";
import "windowscontracts.idl";
import "eventtoken.idl";
/* import "ivectorchangedeventargs.idl"; */
import "windows.foundation.collections.idl";

namespace Windows.Foundation.Collections {
    interface IPropertySet;

    runtimeclass PropertySet;

    declare {
        interface Windows.Foundation.Collections.IKeyValuePair<HSTRING, HSTRING>;
        interface Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, HSTRING> *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Foundation.Collections.IKeyValuePair<HSTRING, HSTRING> *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *>;
        interface Windows.Foundation.Collections.IMapChangedEventArgs<HSTRING>;
        interface Windows.Foundation.Collections.MapChangedEventHandler<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IMap<HSTRING, HSTRING>;
        interface Windows.Foundation.Collections.IMap<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IMapView<HSTRING, HSTRING>;
        interface Windows.Foundation.Collections.IMapView<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IObservableMap<HSTRING, IInspectable *>;
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(8a43ed9f-f4e6-4421-acf9-1dab2986820c)
    ]
    interface IPropertySet : IInspectable
        requires Windows.Foundation.Collections.IObservableMap<HSTRING, IInspectable *>,
                 Windows.Foundation.Collections.IMap<HSTRING, IInspectable *>,
                 Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *>
    {
    }

    [
        activatable(Windows.Foundation.FoundationContract, 1.0),
        contract(Windows.Foundation.FoundationContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass PropertySet
    {
        [default] interface Windows.Foundation.Collections.IPropertySet;
        interface Windows.Foundation.Collections.IObservableMap<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IMap<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *>;
    }

    [
        activatable(Windows.Foundation.FoundationContract, 1.0),
        contract(Windows.Foundation.FoundationContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass ValueSet
    {
        [default] interface Windows.Foundation.Collections.IPropertySet;
        interface Windows.Foundation.Collections.IObservableMap<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IMap<HSTRING, IInspectable *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *>;
    }
}

namespace Windows.Foundation {
    typedef enum PropertyType PropertyType;
    typedef struct Point Point;
    typedef struct Size Size;
    typedef struct Rect Rect;
    typedef struct DateTime DateTime;
    typedef struct TimeSpan TimeSpan;
    interface IAsyncAction;
    interface IClosable;
    interface IDeferral;
    interface IDeferralFactory;
    interface IGetActivationFactory;
    interface IMemoryBuffer;
    interface IMemoryBufferFactory;
    interface IMemoryBufferReference;
    interface IPropertyValue;
    interface IPropertyValueStatics;
    interface IStringable;
    interface IUriEscapeStatics;
    interface IUriRuntimeClass;
    interface IUriRuntimeClassFactory;
    interface IUriRuntimeClassWithAbsoluteCanonicalUri;
    interface IWwwFormUrlDecoderEntry;
    interface IWwwFormUrlDecoderRuntimeClass;
    interface IWwwFormUrlDecoderRuntimeClassFactory;

    runtimeclass Deferral;
    runtimeclass MemoryBuffer;
    runtimeclass PropertyValue;
    runtimeclass Uri;
    runtimeclass WwwFormUrlDecoder;
    runtimeclass WwwFormUrlDecoderEntry;

    declare {
        interface Windows.Foundation.Collections.IIterable<HSTRING>;
        interface Windows.Foundation.Collections.IIterable<IInspectable *>;
        interface Windows.Foundation.Collections.IIterable<IWwwFormUrlDecoderEntry *>;
        interface Windows.Foundation.Collections.IIterable<Uri *>;
        interface Windows.Foundation.Collections.IIterator<HSTRING>;
        interface Windows.Foundation.Collections.IIterator<IInspectable *>;
        interface Windows.Foundation.Collections.IIterator<IWwwFormUrlDecoderEntry *>;
        interface Windows.Foundation.Collections.IIterator<Uri *>;
        interface Windows.Foundation.Collections.IVectorView<BYTE>;
        interface Windows.Foundation.Collections.IVectorView<HSTRING>;
        interface Windows.Foundation.Collections.IVectorView<IInspectable *>;
        interface Windows.Foundation.Collections.IVectorView<IWwwFormUrlDecoderEntry *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Foundation.Uri *>;
        interface Windows.Foundation.Collections.IVector<HSTRING>;
        interface Windows.Foundation.Collections.IVector<IInspectable *>;
        interface Windows.Foundation.Collections.IMapView<HSTRING, Windows.Foundation.Collections.IVectorView<HSTRING> *>;
        interface Windows.Foundation.EventHandler<IInspectable *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<HSTRING>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<IInspectable *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<boolean>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<HSTRING>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<UINT32>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Foundation.Uri *>;
        interface Windows.Foundation.AsyncOperationProgressHandler<UINT32, UINT32>;
        interface Windows.Foundation.AsyncOperationWithProgressCompletedHandler<UINT32, UINT32>;
        interface Windows.Foundation.IAsyncOperation<HSTRING>;
        interface Windows.Foundation.IAsyncOperation<IInspectable *>;
        interface Windows.Foundation.IAsyncOperation<boolean>;
        interface Windows.Foundation.IAsyncOperation<UINT32>;
        interface Windows.Foundation.IAsyncOperation<Windows.Foundation.Uri *>;
        interface Windows.Foundation.IAsyncOperationWithProgress<UINT32, UINT32>;
        interface Windows.Foundation.IReference<BYTE>;
        interface Windows.Foundation.IReference<DOUBLE>;
        interface Windows.Foundation.IReference<FLOAT>;
        interface Windows.Foundation.IReference<GUID>;
        interface Windows.Foundation.IReference<INT16>;
        interface Windows.Foundation.IReference<INT32>;
        interface Windows.Foundation.IReference<INT64>;
        interface Windows.Foundation.IReference<UINT32>;
        interface Windows.Foundation.IReference<UINT64>;
        interface Windows.Foundation.IReference<Windows.Foundation.DateTime>;
        interface Windows.Foundation.IReference<Windows.Foundation.Point>;
        interface Windows.Foundation.IReference<Windows.Foundation.Rect>;
        interface Windows.Foundation.IReference<Windows.Foundation.Size>;
        interface Windows.Foundation.IReference<Windows.Foundation.TimeSpan>;
        interface Windows.Foundation.IReference<boolean>;
        interface Windows.Foundation.TypedEventHandler<IInspectable *, IInspectable *>;
        interface Windows.Foundation.TypedEventHandler<Windows.Foundation.IMemoryBufferReference *, IInspectable *>;
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(a4ed5c81-76c9-40bd-8be6-b1d90fb20ae7)
    ]
    delegate HRESULT AsyncActionCompletedHandler([in] Windows.Foundation.IAsyncAction *action, [in] AsyncStatus status);

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(ed32a372-f3c8-4faa-9cfb-470148da3888)
    ]
    delegate HRESULT DeferralCompletedHandler();

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    enum PropertyType
    {
        Empty       = 0,
        UInt8       = 1,
        Int16       = 2,
        UInt16      = 3,
        Int32       = 4,
        UInt32      = 5,
        Int64       = 6,
        UInt64      = 7,
        Single      = 8,
        Double      = 9,
        Char16      = 10,
        Boolean     = 11,
        String      = 12,
        Inspectable = 13,
        DateTime    = 14,
        TimeSpan    = 15,
        Guid        = 16,
        Point       = 17,
        Size        = 18,
        Rect        = 19,
        OtherType   = 20,
        UInt8Array       = 1025,
        Int16Array       = 1026,
        UInt16Array      = 1027,
        Int32Array       = 1028,
        UInt32Array      = 1029,
        Int64Array       = 1030,
        UInt64Array      = 1031,
        SingleArray      = 1032,
        DoubleArray      = 1033,
        Char16Array      = 1034,
        BooleanArray     = 1035,
        StringArray      = 1036,
        InspectableArray = 1037,
        DateTimeArray    = 1038,
        TimeSpanArray    = 1039,
        GuidArray        = 1040,
        PointArray       = 1041,
        SizeArray        = 1042,
        RectArray        = 1043,
        OtherTypeArray   = 1044,
    };

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    struct Point
    {
        FLOAT X;
        FLOAT Y;
    };

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    struct Size
    {
        FLOAT Width;
        FLOAT Height;
    };

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    struct Rect
    {
        FLOAT X;
        FLOAT Y;
        FLOAT Width;
        FLOAT Height;
    };

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    struct DateTime
    {
        INT64 UniversalTime;
    };

    [contract(Windows.Foundation.FoundationContract, 1.0)]
    struct TimeSpan
    {
        INT64 Duration;
    };

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(96369f54-8eb6-48f0-abce-c1b211e627c3)
    ]
    interface IStringable : IInspectable
    {
        HRESULT ToString([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(30d5a829-7fa4-4026-83bb-d75bae4ea99e)
    ]
    interface IClosable : IInspectable
    {
        HRESULT Close();
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        exclusiveto(Windows.Foundation.Deferral),
        uuid(d6269732-3b7f-46a7-b40b-4fdca2a2c693)
    ]
    interface IDeferral : IInspectable
        requires Windows.Foundation.IClosable
    {
        HRESULT Complete();
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        exclusiveto(Windows.Foundation.Deferral),
        uuid(65a1ecc5-3fb5-4832-8ca9-f061b281d13a)
    ]
    interface IDeferralFactory : IInspectable
    {
        HRESULT Create([in] Windows.Foundation.DeferralCompletedHandler *handler, [out, retval] Windows.Foundation.Deferral **result);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        uuid(4edb8ee2-96dd-49a7-94f7-4607ddab8e3c)
    ]
    interface IGetActivationFactory : IInspectable
    {
        HRESULT GetActivationFactory([in] HSTRING activatable_class_id, [out, retval] IInspectable **factory);
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(5a648006-843a-4da9-865b-9d26e5dfad7b)
    ]
    interface IAsyncAction : IInspectable
        requires IAsyncInfo
    {
        [propput] HRESULT Completed([in] Windows.Foundation.AsyncActionCompletedHandler *handler);
        [propget] HRESULT Completed([out, retval] Windows.Foundation.AsyncActionCompletedHandler **handler);
        HRESULT GetResults();
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        uuid(fbc4dd2a-245b-11e4-af98-689423260cf8)
    ]
    interface IMemoryBuffer : IInspectable
        requires Windows.Foundation.IClosable
    {
        HRESULT CreateReference([out, retval] Windows.Foundation.IMemoryBufferReference **reference);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.MemoryBuffer),
        uuid(fbc4dd2b-245b-11e4-af98-689423260cf8)
    ]
    interface IMemoryBufferFactory : IInspectable
    {
        HRESULT Create([in, range(0x00000000, 0x7fffffff)] UINT32 capacity,
                       [out, retval] Windows.Foundation.MemoryBuffer **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        uuid(fbc4dd29-245b-11e4-af98-689423260cf8)
    ]
    interface IMemoryBufferReference : IInspectable
        requires Windows.Foundation.IClosable
    {
        [propget] HRESULT Capacity([out, retval] UINT32 *value);
        [eventadd] HRESULT Closed([in] Windows.Foundation.TypedEventHandler<Windows.Foundation.IMemoryBufferReference *, IInspectable *> *handler,
                                  [out, retval] EventRegistrationToken *cookie);
        [eventremove] HRESULT Closed([in] EventRegistrationToken cookie);
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        uuid(4bd682dd-7554-40e9-9a9b-82654ede7e62)
    ]
    interface IPropertyValue : IInspectable
    {
        [propget] HRESULT Type([out, retval] Windows.Foundation.PropertyType *value);
        [propget] HRESULT IsNumericScalar([out, retval] boolean *value);
        HRESULT GetUInt8([out, retval] BYTE *value);
        HRESULT GetInt16([out, retval] INT16 *value);
        HRESULT GetUInt16([out, retval] UINT16 *value);
        HRESULT GetInt32([out, retval] INT32 *value);
        HRESULT GetUInt32([out, retval] UINT32 *value);
        HRESULT GetInt64([out, retval] INT64 *value);
        HRESULT GetUInt64([out, retval] UINT64 *value);
        HRESULT GetSingle([out, retval] FLOAT *value);
        HRESULT GetDouble([out, retval] DOUBLE *value);
        HRESULT GetChar16([out, retval] WCHAR *value);
        HRESULT GetBoolean([out, retval] boolean *value);
        HRESULT GetString([out, retval] HSTRING *value);
        HRESULT GetGuid([out, retval] GUID *value);
        HRESULT GetDateTime([out, retval] Windows.Foundation.DateTime *value);
        HRESULT GetTimeSpan([out, retval] Windows.Foundation.TimeSpan *value);
        HRESULT GetPoint([out, retval] Windows.Foundation.Point *value);
        HRESULT GetSize([out, retval] Windows.Foundation.Size *value);
        HRESULT GetRect([out, retval] Windows.Foundation.Rect *value);
        HRESULT GetUInt8Array([out] UINT32 *value_size, [out, size_is(, *value_size)] BYTE **value);
        HRESULT GetInt16Array([out] UINT32 *value_size, [out, size_is(, *value_size)] INT16 **value);
        HRESULT GetUInt16Array([out] UINT32 *value_size, [out, size_is(, *value_size)] UINT16 **value);
        HRESULT GetInt32Array([out] UINT32 *value_size, [out, size_is(, *value_size)] INT32 **value);
        HRESULT GetUInt32Array([out] UINT32 *value_size, [out, size_is(, *value_size)] UINT32 **value);
        HRESULT GetInt64Array([out] UINT32 *value_size, [out, size_is(, *value_size)] INT64 **value);
        HRESULT GetUInt64Array([out] UINT32 *value_size, [out, size_is(, *value_size)] UINT64 **value);
        HRESULT GetSingleArray([out] UINT32 *value_size, [out, size_is(, *value_size)] FLOAT **value);
        HRESULT GetDoubleArray([out] UINT32 *value_size, [out, size_is(, *value_size)] DOUBLE **value);
        HRESULT GetChar16Array([out] UINT32 *value_size, [out, size_is(, *value_size)] WCHAR **value);
        HRESULT GetBooleanArray([out] UINT32 *value_size, [out, size_is(, *value_size)] boolean **value);
        HRESULT GetStringArray([out] UINT32 *value_size, [out, size_is(, *value_size)] HSTRING **value);
        HRESULT GetInspectableArray([out] UINT32 *value_size, [out, size_is(, *value_size)] IInspectable ***value);
        HRESULT GetGuidArray([out] UINT32 *value_size, [out, size_is(, *value_size)] GUID **value);
        HRESULT GetDateTimeArray([out] UINT32 *value_size, [out, size_is(, *value_size)] Windows.Foundation.DateTime **value);
        HRESULT GetTimeSpanArray([out] UINT32 *value_size, [out, size_is(, *value_size)] Windows.Foundation.TimeSpan **value);
        HRESULT GetPointArray([out] UINT32 *value_size, [out, size_is(, *value_size)] Windows.Foundation.Point **value);
        HRESULT GetSizeArray([out] UINT32 *value_size, [out, size_is(, *value_size)] Windows.Foundation.Size **value);
        HRESULT GetRectArray([out] UINT32 *value_size, [out, size_is(, *value_size)] Windows.Foundation.Rect **value);
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        exclusiveto(Windows.Foundation.PropertyValue),
        uuid(629bdbc8-d932-4ff4-96b9-8d96c5c1e858)
    ]
    interface IPropertyValueStatics : IInspectable
    {
        HRESULT CreateEmpty([out, retval] IInspectable **property_value);
        HRESULT CreateUInt8([in] BYTE value, [out, retval] IInspectable **property_value);
        HRESULT CreateInt16([in] INT16 value, [out, retval] IInspectable **property_value);
        HRESULT CreateUInt16([in] UINT16 value, [out, retval] IInspectable **property_value);
        HRESULT CreateInt32([in] INT32 value, [out, retval] IInspectable **property_value);
        HRESULT CreateUInt32([in] UINT32 value, [out, retval] IInspectable **property_value);
        HRESULT CreateInt64([in] INT64 value, [out, retval] IInspectable **property_value);
        HRESULT CreateUInt64([in] UINT64 value, [out, retval] IInspectable **property_value);
        HRESULT CreateSingle([in] FLOAT value, [out, retval] IInspectable **property_value);
        HRESULT CreateDouble([in] DOUBLE value, [out, retval] IInspectable **property_value);
        HRESULT CreateChar16([in] WCHAR value, [out, retval] IInspectable **property_value);
        HRESULT CreateBoolean([in] boolean value, [out, retval] IInspectable **property_value);
        HRESULT CreateString([in] HSTRING value, [out, retval] IInspectable **property_value);
        HRESULT CreateInspectable([in] IInspectable *value, [out, retval] IInspectable **property_value);
        HRESULT CreateGuid([in] GUID value, [out, retval] IInspectable **property_value);
        HRESULT CreateDateTime([in] Windows.Foundation.DateTime value, [out, retval] IInspectable **property_value);
        HRESULT CreateTimeSpan([in] Windows.Foundation.TimeSpan value, [out, retval] IInspectable **property_value);
        HRESULT CreatePoint([in] Windows.Foundation.Point value, [out, retval] IInspectable **property_value);
        HRESULT CreateSize([in] Windows.Foundation.Size value, [out, retval] IInspectable **property_value);
        HRESULT CreateRect([in] Windows.Foundation.Rect value, [out, retval] IInspectable **property_value);
        HRESULT CreateUInt8Array([in] UINT32 value_size, [in, size_is(value_size)] BYTE *value, [out, retval] IInspectable **property_value);
        HRESULT CreateInt16Array([in] UINT32 value_size, [in, size_is(value_size)] INT16 *value, [out, retval] IInspectable **property_value);
        HRESULT CreateUInt16Array([in] UINT32 value_size, [in, size_is(value_size)] UINT16 *value, [out, retval] IInspectable **property_value);
        HRESULT CreateInt32Array([in] UINT32 value_size, [in, size_is(value_size)] INT32 *value, [out, retval] IInspectable **property_value);
        HRESULT CreateUInt32Array([in] UINT32 value_size, [in, size_is(value_size)] UINT32 *value, [out, retval] IInspectable **property_value);
        HRESULT CreateInt64Array([in] UINT32 value_size, [in, size_is(value_size)] INT64 *value, [out, retval] IInspectable **property_value);
        HRESULT CreateUInt64Array([in] UINT32 value_size, [in, size_is(value_size)] UINT64 *value, [out, retval] IInspectable **property_value);
        HRESULT CreateSingleArray([in] UINT32 value_size, [in, size_is(value_size)] FLOAT *value, [out, retval] IInspectable **property_value);
        HRESULT CreateDoubleArray([in] UINT32 value_size, [in, size_is(value_size)] DOUBLE *value, [out, retval] IInspectable **property_value);
        HRESULT CreateChar16Array([in] UINT32 value_size, [in, size_is(value_size)] WCHAR *value, [out, retval] IInspectable **property_value);
        HRESULT CreateBooleanArray([in] UINT32 value_size, [in, size_is(value_size)] boolean *value, [out, retval] IInspectable **property_value);
        HRESULT CreateStringArray([in] UINT32 value_size, [in, size_is(value_size)] HSTRING *value, [out, retval] IInspectable **property_value);
        HRESULT CreateInspectableArray([in] UINT32 value_size, [in, size_is(value_size)] IInspectable **value, [out, retval] IInspectable **property_value);
        HRESULT CreateGuidArray([in] UINT32 value_size, [in, size_is(value_size)] GUID *value, [out, retval] IInspectable **property_value);
        HRESULT CreateDateTimeArray([in] UINT32 value_size, [in, size_is(value_size)] Windows.Foundation.DateTime *value, [out, retval] IInspectable **property_value);
        HRESULT CreateTimeSpanArray([in] UINT32 value_size, [in, size_is(value_size)] Windows.Foundation.TimeSpan *value, [out, retval] IInspectable **property_value);
        HRESULT CreatePointArray([in] UINT32 value_size, [in, size_is(value_size)] Windows.Foundation.Point *value, [out, retval] IInspectable **property_value);
        HRESULT CreateSizeArray([in] UINT32 value_size, [in, size_is(value_size)] Windows.Foundation.Size *value, [out, retval] IInspectable **property_value);
        HRESULT CreateRectArray([in] UINT32 value_size, [in, size_is(value_size)] Windows.Foundation.Rect *value, [out, retval] IInspectable **property_value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.Uri),
        uuid(c1d432ba-c824-4452-a7fd-512bc3bbe9a1)
    ]
    interface IUriEscapeStatics : IInspectable
    {
        HRESULT UnescapeComponent([in] HSTRING to_unescape, [out, retval] HSTRING *value);
        HRESULT EscapeComponent([in] HSTRING to_escape, [out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.Uri),
        uuid(9e365e57-48b2-4160-956f-c7385120bbfc)
    ]
    interface IUriRuntimeClass : IInspectable
    {
        [propget] HRESULT AbsoluteUri([out, retval] HSTRING *value);
        [propget] HRESULT DisplayUri([out, retval] HSTRING *value);
        [propget] HRESULT Domain([out, retval] HSTRING *value);
        [propget] HRESULT Extension([out, retval] HSTRING *value);
        [propget] HRESULT Fragment([out, retval] HSTRING *value);
        [propget] HRESULT Host([out, retval] HSTRING *value);
        [propget] HRESULT Password([out, retval] HSTRING *value);
        [propget] HRESULT Path([out, retval] HSTRING *value);
        [propget] HRESULT Query([out, retval] HSTRING *value);
        [propget] HRESULT QueryParsed([out, retval] Windows.Foundation.WwwFormUrlDecoder **decoder);
        [propget] HRESULT RawUri([out, retval] HSTRING *value);
        [propget] HRESULT SchemeName([out, retval] HSTRING *value);
        [propget] HRESULT UserName([out, retval] HSTRING *value);
        [propget] HRESULT Port([out, retval] INT32 *value);
        [propget] HRESULT Suspicious([out, retval] boolean *value);
        HRESULT Equals([in] Windows.Foundation.Uri *uri, [out, retval] boolean *value);
        HRESULT CombineUri([in] HSTRING relative_uri, [out, retval] Windows.Foundation.Uri **instance);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.Uri),
        uuid(44a9796f-723e-4fdf-a218-033e75b0c084)
    ]
    interface IUriRuntimeClassFactory : IInspectable
    {
        HRESULT CreateUri([in] HSTRING uri, [out, retval] Windows.Foundation.Uri **instance);
        HRESULT CreateWithRelativeUri([in] HSTRING base_uri, [in] HSTRING relative_uri, [out, retval] Windows.Foundation.Uri **instance);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.Uri),
        uuid(758d9661-221c-480f-a339-50656673f46f)
    ]
    interface IUriRuntimeClassWithAbsoluteCanonicalUri : IInspectable
    {
        [propget] HRESULT AbsoluteCanonicalUri([out, retval] HSTRING *value);
        [propget] HRESULT DisplayIri([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        uuid(125e7431-f678-4e8e-b670-20a9b06c512d)
    ]
    interface IWwwFormUrlDecoderEntry : IInspectable
    {
        [propget] HRESULT Name([out, retval] HSTRING *value);
        [propget] HRESULT Value([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.WwwFormUrlDecoder),
        uuid(d45a0451-f225-4542-9296-0e1df5d254df)
    ]
    interface IWwwFormUrlDecoderRuntimeClass : IInspectable
        requires Windows.Foundation.Collections.IIterable<Windows.Foundation.IWwwFormUrlDecoderEntry *>,
                 Windows.Foundation.Collections.IVectorView<Windows.Foundation.IWwwFormUrlDecoderEntry *>
    {
        HRESULT GetFirstValueByName([in] HSTRING name, [out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Foundation.WwwFormUrlDecoder),
        uuid(5b8c6b3d-24ae-41b5-a1bf-f0c3d544845b)
    ]
    interface IWwwFormUrlDecoderRuntimeClassFactory : IInspectable
    {
        HRESULT CreateWwwFormUrlDecoder([in] HSTRING query, [out, retval] Windows.Foundation.WwwFormUrlDecoder **instance);
    }

    [
        activatable(Windows.Foundation.IDeferralFactory, Windows.Foundation.FoundationContract, 1.0),
        contract(Windows.Foundation.FoundationContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass Deferral
    {
        [default] interface Windows.Foundation.IDeferral;
        interface Windows.Foundation.IClosable;
    }

    [
        activatable(Windows.Foundation.IMemoryBufferFactory, Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass MemoryBuffer
    {
        [default] interface Windows.Foundation.IMemoryBuffer;
        interface Windows.Foundation.IClosable;
    }

    [
        contract(Windows.Foundation.FoundationContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.Foundation.IPropertyValueStatics, Windows.Foundation.FoundationContract, 1.0),
        threading(both)
    ]
    runtimeclass PropertyValue
    {
    }

    [
        activatable(Windows.Foundation.IUriRuntimeClassFactory, Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.Foundation.IUriEscapeStatics, Windows.Foundation.UniversalApiContract, 1.0),
        threading(both)
    ]
    runtimeclass Uri
    {
        [default] interface Windows.Foundation.IUriRuntimeClass;
        interface Windows.Foundation.IUriRuntimeClassWithAbsoluteCanonicalUri;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Foundation.IStringable;
    }

    [
        activatable(Windows.Foundation.IWwwFormUrlDecoderRuntimeClassFactory, Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass WwwFormUrlDecoder
    {
        [default] interface Windows.Foundation.IWwwFormUrlDecoderRuntimeClass;
        interface Windows.Foundation.Collections.IVectorView<Windows.Foundation.IWwwFormUrlDecoderEntry *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Foundation.IWwwFormUrlDecoderEntry *>;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass WwwFormUrlDecoderEntry
    {
        [default] interface Windows.Foundation.IWwwFormUrlDecoderEntry;
    }
}
