/*
 * COM Classes for mshtml
 *
 * Copyright 2010 Alexandre Julliard
 *
 * 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
 */

[
    helpstring("Microsoft HTML About Pluggable Protocol"),
    threading(apartment),
    uuid(3050f406-98b5-11cf-bb82-00aa00bdce0b)
]
coclass AboutProtocol { }

[
    helpstring("Microsoft Anchor Element Browse Property Page"),
    threading(apartment),
    uuid(3050f3bb-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CAnchorBrowsePropertyPage { }

[
    helpstring("Microsoft HTML Background Page"),
    threading(apartment),
    uuid(3050f232-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CBackgroundPropertyPage { }

[
    helpstring("Microsoft HTML Anchor Page"),
    threading(apartment),
    uuid(3050f1fc-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CCDAnchorPropertyPage { }

[
    helpstring("Microsoft HTML Generic Page"),
    threading(apartment),
    uuid(3050f17f-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CCDGenericPropertyPage { }

[
    helpstring("Microsoft Document Browse Property Page"),
    threading(apartment),
    uuid(3050f3b4-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CDocBrowsePropertyPage { }

[
    helpstring("Microsoft HTML DwnBindInfo"),
    threading(apartment),
    uuid(3050f3c2-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CDwnBindInfo { }

[
    helpstring("Microsoft HTML External Document"),
    threading(apartment),
    uuid(3050f163-98b5-11cf-bb82-00aa00bdce0b)
]
coclass ExternalFrameworkSite { }

[
    helpstring("Microsoft Scriptlet HiFiTimer Uses"),
    progid("Scriptlet.HiFiTimer"),
    threading(apartment),
    uuid(5aaf51b3-b1f0-11d1-b6ab-00a0c90833e9)
]
coclass CHiFiUses { }

[
    helpstring("Microsoft Html Component"),
    threading(apartment),
    uuid(3050f4f8-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CHtmlComponentConstructor { }

[
    helpstring("Microsoft Image Element Browse Property Page"),
    threading(apartment),
    uuid(3050f3b3-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CImageBrowsePropertyPage { }

[
    helpstring("Microsoft HTML Inline Style Page"),
    threading(apartment),
    uuid(3050f296-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CInlineStylePropertyPage { }

[
    helpstring("Microsoft Scriptlet Element Behavior Handler"),
    progid("Scriptlet.Behavior"),
    threading(apartment),
    uuid(5aaf51b2-b1f0-11d1-b6ab-00a0c90833e9)
]
coclass CPeerHandler { }

[
    helpstring("Microsoft HTML Recalc"),
    threading(apartment),
    uuid(3050f499-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CRecalcEngine { }

[
    helpstring("Microsoft CrSource 4.0"),
    threading(apartment),
    progid("CrSource"),
    version(4.0),
    uuid(65014010-9f62-11d1-a651-00600811d5ce)
]
coclass CrSource { }

[
    helpstring("Microsoft Scriptlet svr om Uses"),
    progid("Scriptlet.SvrOm"),
    threading(apartment),
    uuid(3050f4f0-98b5-11cf-bb82-00aa00bdce0b)
]
coclass CSvrOMUses { }

[
    helpstring("Microsoft HTA Document 6.0"),
    threading(apartment),
    version(6.0),
    uuid(3050f5c8-98b5-11cf-bb82-00aa00bdce0b)
]
coclass HTADocument { }

[
    helpstring("HTML Document"),
    progid("htmlfile"),
    threading(apartment),
    version(6.0),
    uuid(25336920-03f9-11cf-8fd0-00aa00686f13)
]
coclass HTMLDocument { }

[
    helpstring("Microsoft HTML Document 6.0"),
    progid("htmlfile_FullWindowEmbed"),
    threading(apartment),
    uuid(25336921-03f9-11cf-8fd0-00aa00686f13)
]
coclass HTMLPluginDocument { }

[
    helpstring("Microsoft Html Popup Window"),
    threading(apartment),
    uuid(3050f667-98b5-11cf-bb82-00aa00bdce0b)
]
coclass HTMLPopup { }

[
    helpstring("Microsoft Html Document for Popup Window"),
    threading(apartment),
    uuid(3050f67d-98b5-11cf-bb82-00aa00bdce0b)
]
coclass HTMLPopupDoc { }

[
    helpstring("Microsoft HTML Server Document 6.0"),
    threading(apartment),
    uuid(3050f4e7-98b5-11cf-bb82-00aa00bdce0b)
]
coclass HTMLServerDoc { }

[
    helpstring("Microsoft HTML Window Security Proxy"),
    threading(apartment),
    uuid(3050f391-98b5-11cf-bb82-00aa00bdce0b)
]
coclass HTMLWindowProxy { }

[
    helpstring("CoBMPFilter Class"),
    progid("BMPFilter.CoBMPFilter.1"),
    vi_progid("BMPFilter.CoBMPFilter"),
    threading(apartment),
    uuid(607fd4e8-0a03-11d1-ab1d-00c04fc9b304)
]
coclass CoBMPFilter { }

[
    helpstring("CoGIFFilter Class"),
    progid("GIFFilter.CoGIFFilter.1"),
    vi_progid("GIFFilter.CoGIFFilter"),
    threading(apartment),
    uuid(607fd4e8-0a03-11d1-ab1d-00c04fc9b304)
]
coclass CoGIFFilter { }

[
    helpstring("CoJPEGFilter Class"),
    progid("JPEGFilter.CoJPEGFilter.1"),
    vi_progid("JPEGFilter.CoJPEGFilter"),
    threading(apartment),
    uuid(607fd4e8-0a03-11d1-ab1d-00c04fc9b304)
]
coclass CoJPEGFilter { }

[
    helpstring("CoWMFFilter Class"),
    progid("WMFFilter.CoWMFFilter.1"),
    vi_progid("WMFFilter.CoWMFFilter"),
    threading(apartment),
    uuid(607fd4e8-0a03-11d1-ab1d-00c04fc9b304)
]
coclass CoWMFFilter { }

[
    helpstring("CoICOFilter Class"),
    progid("ICOFilter.CoICOFilter.1"),
    vi_progid("ICOFilter.CoICOFilter"),
    threading(apartment),
    uuid(607fd4e8-0a03-11d1-ab1d-00c04fc9b304)
]
coclass CoICOFilter { }

[
    progid("IImgCtx"),
    threading(apartment),
    uuid(3050f3d6-98b5-11cf-bb82-00aa00bdce0b)
]
coclass IImgCtx { }

[
    helpstring("Microsoft HTML Load Options"),
    threading(apartment),
    uuid(18845040-0fa5-11d1-ba19-00c04fd912d0)
]
coclass HTMLLoadOptions { }

[
    helpstring("IntDitherer Class"),
    threading(apartment),
    uuid(05f6fe1a-ecef-11d0-aae7-00c04fc9b304)
]
coclass IntDitherer { }

[
    helpstring("Microsoft HTML Javascript Pluggable Protocol"),
    threading(apartment),
    uuid(3050f3b2-98b5-11cf-bb82-00aa00bdce0b)
]
coclass JSProtocol { }

[
    helpstring("Microsoft HTML Mailto Pluggable Protocol"),
    threading(apartment),
    uuid(3050f3da-98b5-11cf-bb82-00aa00bdce0b)
]
coclass MailtoProtocol { }

[
    helpstring("MHTML Document"),
    progid("mhtmlfile"),
    threading(apartment),
    version(6.0),
    uuid(3050f3d9-98b5-11cf-bb82-00aa00bdce0b)
]
coclass MHTMLDocument { }

[
    helpstring("Microsoft HTML Resource Pluggable Protocol"),
    threading(apartment),
    uuid(3050f3bc-98b5-11cf-bb82-00aa00bdce0b)
]
coclass ResProtocol { }

[
    helpstring("Microsoft Scriptlet Component"),
    progid("ScriptBridge.ScriptBridge.1"),
    vi_progid("ScriptBridge.ScriptBridge"),
    threading(apartment),
    uuid(ae24fdae-03c6-11d1-8b76-0080c744f389)
]
coclass Scriptlet { }

[
    helpstring("Microsoft HTML Resource Pluggable Protocol"),
    threading(apartment),
    uuid(76e67a63-06e9-11d2-a840-006008059382)
]
coclass SysimageProtocol { }

[
    helpstring("Trident API"),
    threading(apartment),
    uuid(429af92c-a51f-11d2-861e-00c04fa35c89)
]
coclass TridentAPI { }
