diff --git a/code/AssimpPCH.h b/code/AssimpPCH.h index 004e11283..f470ca693 100644 --- a/code/AssimpPCH.h +++ b/code/AssimpPCH.h @@ -136,6 +136,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../include/assimp/IOStream.hpp" #include "../include/assimp/IOSystem.hpp" #include "../include/assimp/scene.h" +#include "../include/assimp/importerdesc.h" #include "../include/assimp/postprocess.h" #include "../include/assimp/Importer.hpp" #include "../include/assimp/Exporter.hpp" diff --git a/code/BaseImporter.h b/code/BaseImporter.h index e701bca0d..07b937d79 100644 --- a/code/BaseImporter.h +++ b/code/BaseImporter.h @@ -190,7 +190,15 @@ public: protected: // ------------------------------------------------------------------- - /** Called by Importer::GetExtensionList() for each loaded importer. + /** Called by #Importer::GetImporterInfo to get a description of + * some loader features. Importer need not provide this structure, + * but it is highly recommended. */ + virtual const aiImporterDesc* GetInfo() { + return NULL; + } + + // ------------------------------------------------------------------- + /** Called by #Importer::GetExtensionList for each loaded importer. * Implementations are expected to insert() all file extensions * handled by them into the extension set. A loader capable of * reading certain files with the extension BLA would place the diff --git a/code/BlenderLoader.cpp b/code/BlenderLoader.cpp index 91579d3f6..82b11c22b 100644 --- a/code/BlenderLoader.cpp +++ b/code/BlenderLoader.cpp @@ -71,12 +71,12 @@ using namespace Assimp; using namespace Assimp::Blender; using namespace Assimp::Formatter; -static const aiLoaderDesc blenderDesc = { +static const aiImporterDesc blenderDesc = { "Blender 3D Importer \nhttp://www.blender3d.org", - "Assimp Team", "", "", - aiLoaderFlags_SupportBinaryFlavour | aiLoaderFlags_Experimental, + "", + aiImporterFlags_SupportBinaryFlavour | aiImporterFlags_Experimental, 0, 0, 2, @@ -123,9 +123,9 @@ void BlenderImporter::GetExtensionList(std::set& app) // ------------------------------------------------------------------------------------------------ // Loader registry entry -const aiLoaderDesc& BlenderImporter::GetInfo () const +const aiImporterDesc* BlenderImporter::GetInfo () const { - return blenderDesc; + return &blenderDesc; } // ------------------------------------------------------------------------------------------------ diff --git a/code/BlenderLoader.h b/code/BlenderLoader.h index 6a3b17127..f2109f663 100644 --- a/code/BlenderLoader.h +++ b/code/BlenderLoader.h @@ -85,32 +85,6 @@ namespace Assimp { class BlenderModifier; } -enum aiLoaderFlags -{ - aiLoaderFlags_SupportAsciiFlavour = 0x1, - aiLoaderFlags_SupportBinaryFlavour = 0x2, - aiLoaderFlags_SupportCompressedFlavour = 0x4, - - aiLoaderFlags_LimitedSupport = 0x8, - - aiLoaderFlags_Experimental = 0x10, - aiLoaderFlags_Testing = 0x20, - aiLoaderFlags_Production = 0x40 -}; - -struct aiLoaderDesc -{ - const char* mName; - const char* mAuthor; - const char* mMaintainer; - const char* mComments; - unsigned int mFlags; - - unsigned int mMinMajor; - unsigned int mMinMinor; - unsigned int mMaxMajor; - unsigned int mMaxMinor; -}; // ------------------------------------------------------------------------------------------- @@ -136,7 +110,7 @@ public: protected: // -------------------- - const aiLoaderDesc& GetInfo () const; + const aiImporterDesc* GetInfo () const; // -------------------- void GetExtensionList(std::set& app); diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 461576125..8db1ab8a6 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -46,6 +46,7 @@ SET( PUBLIC_HEADERS ${HEADER_PATH}/vector3.inl ${HEADER_PATH}/version.h ${HEADER_PATH}/cimport.h + ${HEADER_PATH}/importerdesc.h ${HEADER_PATH}/Importer.hpp ${HEADER_PATH}/DefaultLogger.hpp ${HEADER_PATH}/ProgressHandler.hpp diff --git a/code/Importer.cpp b/code/Importer.cpp index d3c1025c8..98353776d 100644 --- a/code/Importer.cpp +++ b/code/Importer.cpp @@ -818,12 +818,44 @@ const aiScene* Importer::ApplyPostProcessing(unsigned int pFlags) // Helper function to check whether an extension is supported by ASSIMP bool Importer::IsExtensionSupported(const char* szExtension) const { - return NULL != FindLoader(szExtension); + return NULL != GetImporter(szExtension); +} + +// ------------------------------------------------------------------------------------------------ +size_t Importer::GetImporterCount() const +{ + return pimpl->mImporter.size(); +} + +// ------------------------------------------------------------------------------------------------ +const aiImporterDesc* Importer::GetImporterInfo(size_t index) const +{ + if (index >= pimpl->mImporter.size()) { + return NULL; + } + return pimpl->mImporter[index]->GetInfo(); +} + + +// ------------------------------------------------------------------------------------------------ +BaseImporter* Importer::GetImporter (size_t index) const +{ + if (index >= pimpl->mImporter.size()) { + return NULL; + } + return pimpl->mImporter[index]; } // ------------------------------------------------------------------------------------------------ // Find a loader plugin for a given file extension -BaseImporter* Importer::FindLoader (const char* szExtension) const +BaseImporter* Importer::GetImporter (const char* szExtension) const +{ + return GetImporter(GetImporterIndex(szExtension)); +} + +// ------------------------------------------------------------------------------------------------ +// Find a loader plugin for a given file extension +size_t Importer::GetImporterIndex (const char* szExtension) const { ai_assert(szExtension); ASSIMP_BEGIN_EXCEPTION_REGION(); @@ -844,12 +876,12 @@ BaseImporter* Importer::FindLoader (const char* szExtension) const (*i)->GetExtensionList(str); for (std::set::const_iterator it = str.begin(); it != str.end(); ++it) { if (ext == *it) { - return (*i); + return std::distance(static_cast< std::vector::const_iterator >(pimpl->mImporter.begin()), i); } } } - ASSIMP_END_EXCEPTION_REGION(BaseImporter*); - return NULL; + ASSIMP_END_EXCEPTION_REGION(size_t); + return static_cast(-1); } // ------------------------------------------------------------------------------------------------ diff --git a/include/assimp/Importer.hpp b/include/assimp/Importer.hpp index d78a26ed0..1f780522b 100644 --- a/include/assimp/Importer.hpp +++ b/include/assimp/Importer.hpp @@ -84,6 +84,9 @@ namespace Assimp { struct aiScene; +// importerdesc.h +struct aiImporterDesc; + /** @namespace Assimp Assimp's CPP-API and all internal APIs */ namespace Assimp { @@ -468,59 +471,6 @@ public: * following methods is called: #ReadFile(), #FreeScene(). */ const char* GetErrorString() const; - - // ------------------------------------------------------------------- - /** Returns whether a given file extension is supported by ASSIMP. - * - * @param szExtension Extension to be checked. - * Must include a trailing dot '.'. Example: ".3ds", ".md3". - * Cases-insensitive. - * @return true if the extension is supported, false otherwise */ - bool IsExtensionSupported(const char* szExtension) const; - - // ------------------------------------------------------------------- - /** @brief Returns whether a given file extension is supported by ASSIMP. - * - * This function is provided for backward compatibility. - * See the const char* version for detailed and up-to-date docs. - * @see IsExtensionSupported(const char*) */ - inline bool IsExtensionSupported(const std::string& szExtension) const; - - - // ------------------------------------------------------------------- - /** Get a full list of all file extensions supported by ASSIMP. - * - * If a file extension is contained in the list this does of course not - * mean that ASSIMP is able to load all files with this extension --- - * it simply means there is an importer loaded which claims to handle - * files with this file extension. - * @param szOut String to receive the extension list. - * Format of the list: "*.3ds;*.obj;*.dae". This is useful for - * use with the WinAPI call GetOpenFileName(Ex). */ - void GetExtensionList(aiString& szOut) const; - - // ------------------------------------------------------------------- - /** @brief Get a full list of all file extensions supported by ASSIMP. - * - * This function is provided for backward compatibility. - * See the aiString version for detailed and up-to-date docs. - * @see GetExtensionList(aiString&)*/ - inline void GetExtensionList(std::string& szOut) const; - - - // ------------------------------------------------------------------- - /** Find the loader corresponding to a specific file extension. - * - * This is quite similar to IsExtensionSupported() except a - * BaseImporter instance is returned. - * @param szExtension Extension to check for. The following formats - * are recgnized (BAH being the file extension): "BAH" (comparison - * is case-insensitive), ".bah", "*.bah" (wild card and dot - * characters at the beginning of the extension are skipped). - * @return NULL if there is no loader for the extension.*/ - BaseImporter* FindLoader (const char* szExtension) const; - - // ------------------------------------------------------------------- /** Returns the scene loaded by the last successful call to ReadFile() * @@ -543,11 +493,98 @@ public: * are not necessarily shared. GetOrphanedScene() enforces you * to delete the returned scene by yourself, but this will only * be fine if and only if you're using the same heap as assimp. - * On Windows, it's typically fine when everything is linked + * On Windows, it's typically fine provided everything is linked * against the multithreaded-dll version of the runtime library. * It will work as well for static linkage with Assimp.*/ aiScene* GetOrphanedScene(); + + + + // ------------------------------------------------------------------- + /** Returns whether a given file extension is supported by ASSIMP. + * + * @param szExtension Extension to be checked. + * Must include a trailing dot '.'. Example: ".3ds", ".md3". + * Cases-insensitive. + * @return true if the extension is supported, false otherwise */ + bool IsExtensionSupported(const char* szExtension) const; + + // ------------------------------------------------------------------- + /** @brief Returns whether a given file extension is supported by ASSIMP. + * + * This function is provided for backward compatibility. + * See the const char* version for detailed and up-to-date docs. + * @see IsExtensionSupported(const char*) */ + inline bool IsExtensionSupported(const std::string& szExtension) const; + + // ------------------------------------------------------------------- + /** Get a full list of all file extensions supported by ASSIMP. + * + * If a file extension is contained in the list this does of course not + * mean that ASSIMP is able to load all files with this extension --- + * it simply means there is an importer loaded which claims to handle + * files with this file extension. + * @param szOut String to receive the extension list. + * Format of the list: "*.3ds;*.obj;*.dae". This is useful for + * use with the WinAPI call GetOpenFileName(Ex). */ + void GetExtensionList(aiString& szOut) const; + + // ------------------------------------------------------------------- + /** @brief Get a full list of all file extensions supported by ASSIMP. + * + * This function is provided for backward compatibility. + * See the aiString version for detailed and up-to-date docs. + * @see GetExtensionList(aiString&)*/ + inline void GetExtensionList(std::string& szOut) const; + + // ------------------------------------------------------------------- + /** Get the number of importrs currently registered with Assimp. */ + size_t GetImporterCount() const; + + // ------------------------------------------------------------------- + /** Get meta data for the importer corresponding to a specific index.. + * + * For the declaration of #aiImporterDesc, include . + * @param index Index to query, must be within [0,GetImporterCount()) + * @return Importer meta data structure, NULL if the index does not + * exist or if the importer doesn't offer meta information ( + * importers may do this at the cost of being hated by their peers).*/ + const aiImporterDesc* GetImporterInfo(size_t index) const; + + // ------------------------------------------------------------------- + /** Find the importer corresponding to a specific index. + * + * @param index Index to query, must be within [0,GetImporterCount()) + * @return Importer instance. NULL if the index does not + * exist. */ + BaseImporter* GetImporter(size_t index) const; + + // ------------------------------------------------------------------- + /** Find the importer corresponding to a specific file extension. + * + * This is quite similar to #IsExtensionSupported except a + * BaseImporter instance is returned. + * @param szExtension Extension to check for. The following formats + * are recognized (BAH being the file extension): "BAH" (comparison + * is case-insensitive), ".bah", "*.bah" (wild card and dot + * characters at the beginning of the extension are skipped). + * @return NULL if no importer is found*/ + BaseImporter* GetImporter (const char* szExtension) const; + + // ------------------------------------------------------------------- + /** Find the importer index corresponding to a specific file extension. + * + * @param szExtension Extension to check for. The following formats + * are recognized (BAH being the file extension): "BAH" (comparison + * is case-insensitive), ".bah", "*.bah" (wild card and dot + * characters at the beginning of the extension are skipped). + * @return (size_t)-1 if no importer is found */ + size_t GetImporterIndex (const char* szExtension) const; + + + + // ------------------------------------------------------------------- /** Returns the storage allocated by ASSIMP to hold the scene data * in memory. diff --git a/include/assimp/importerdesc.h b/include/assimp/importerdesc.h new file mode 100644 index 000000000..0588d615d --- /dev/null +++ b/include/assimp/importerdesc.h @@ -0,0 +1,122 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2012, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +/** @file importerdesc.h + * @brief #aiImporterFlags, aiImporterDesc implementation. + */ +#ifndef INCLUDED_AI_IMPORTER_DESC_H +#define INCLUDED_AI_IMPORTER_DESC_H + + +/** Mixed set of flags for #aiImporterDesc, indicating some features + * common to many importers*/ +enum aiImporterFlags +{ + /** Indicates that there is a textual encoding of the + * file format; and that it is supported.*/ + aiImporterFlags_SupportTextFlavour = 0x1, + + /** Indicates that there is a binary encoding of the + * file format; and that it is supported.*/ + aiImporterFlags_SupportBinaryFlavour = 0x2, + + /** Indicates that there is a compressed encoding of the + * file format; and that it is supported.*/ + aiImporterFlags_SupportCompressedFlavour = 0x4, + + /** Indicates that the importer reads only a very particular + * subset of the file format. This happens commonly for + * declarative or procedural formats which cannot easily + * be mapped to #aiScene */ + aiImporterFlags_LimitedSupport = 0x8, + + /** Indicates that the importer is highly experimental and + * should be used with care. This only happens for trunk + * (i.e. SVN) versions, experimental code is not included + * in releases. */ + aiImporterFlags_Experimental = 0x10, +}; + + +/** Meta information about a particular importer. Importers need to fill + * this structure, but they can freely decide how talkative they are. + * A common use case for loader meta info is a user interface + * in which the user can choose between various import/export file + * formats. Building such an UI by hand means a lot of maintenance + * as importers/exporters are added to Assimp, so it might be useful + * to have a common mechanism to query some rough importer + * characteristics. */ +struct aiImporterDesc +{ + /** Full name of the importer (i.e. Blender3D importer)*/ + const char* mName; + + /** Original author (left blank if unknown or whole assimp team) */ + const char* mAuthor; + + /** Current maintainer, left blank if the author maintains */ + const char* mMaintainer; + + /** Implementation comments, i.e. unimplemented features*/ + const char* mComments; + + /** Any combination of the #aiLoaderFlags enumerated values. + These flags indicate some characteristics common to many + importers. */ + unsigned int mFlags; + + /** Minimum format version that can be loaded im major.minor format, + both are set to 0 if there is either no version scheme + or if the loader doesn't care. */ + unsigned int mMinMajor; + unsigned int mMinMinor; + + /** Maximum format version that can be loaded im major.minor format, + both are set to 0 if there is either no version scheme + or if the loader doesn't care. Loaders that expect to be + forward-compatible to potential future format versions should + indicate zero, otherwise they should specify the current + maximum version.*/ + unsigned int mMaxMajor; + unsigned int mMaxMinor; +}; + +#endif diff --git a/workspaces/vc9/assimp.vcproj b/workspaces/vc9/assimp.vcproj index a7168664f..3683d1622 100644 --- a/workspaces/vc9/assimp.vcproj +++ b/workspaces/vc9/assimp.vcproj @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2183,6 +2187,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2207,6 +2219,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2231,22 +2251,6 @@ UsePrecompiledHeader="0" /> - - - - - - @@ -2381,6 +2385,14 @@ PrecompiledHeaderThrough="AssimpPCH.h" /> + + + @@ -2408,6 +2420,14 @@ PrecompiledHeaderThrough="AssimpPCH.h" /> + + + @@ -2435,22 +2455,6 @@ PrecompiledHeaderThrough="AssimpPCH.h" /> - - - - - - @@ -2758,62 +2762,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -2822,6 +2770,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2830,6 +2786,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2838,6 +2802,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2846,6 +2818,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2854,6 +2834,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2862,6 +2850,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2870,6 +2866,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2902,62 +2906,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -2966,6 +2914,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2974,6 +2930,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2982,6 +2946,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2990,6 +2962,14 @@ UsePrecompiledHeader="0" /> + + + @@ -2998,6 +2978,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3006,6 +2994,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3014,6 +3010,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3034,62 +3038,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -3098,6 +3046,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3106,6 +3062,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3114,6 +3078,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3122,6 +3094,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3130,6 +3110,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3138,6 +3126,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3146,6 +3142,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3174,62 +3178,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -3238,6 +3186,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3246,6 +3202,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3254,6 +3218,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3262,6 +3234,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3270,6 +3250,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3278,6 +3266,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3286,6 +3282,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3314,62 +3318,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -3378,6 +3326,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3386,6 +3342,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3394,6 +3358,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3402,6 +3374,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3410,6 +3390,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3418,6 +3406,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3426,6 +3422,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3450,62 +3454,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -3514,6 +3462,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3522,6 +3478,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3530,6 +3494,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3538,6 +3510,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3546,6 +3526,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3554,6 +3542,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3562,6 +3558,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3586,62 +3590,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -3650,6 +3598,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3658,6 +3614,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3666,6 +3630,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3674,6 +3646,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3682,6 +3662,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3690,6 +3678,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3698,6 +3694,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3722,62 +3726,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -3786,6 +3734,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3794,6 +3750,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3802,6 +3766,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3810,6 +3782,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3818,6 +3798,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3826,6 +3814,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3834,6 +3830,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3870,62 +3874,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -3934,6 +3882,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3942,6 +3898,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3950,6 +3914,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3958,6 +3930,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3966,6 +3946,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3974,6 +3962,14 @@ UsePrecompiledHeader="0" /> + + + @@ -3982,6 +3978,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4010,62 +4014,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -4074,6 +4022,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4082,6 +4038,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4090,6 +4054,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4098,6 +4070,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4106,6 +4086,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4114,6 +4102,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4122,6 +4118,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4150,62 +4154,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -4214,6 +4162,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4222,6 +4178,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4230,6 +4194,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4238,6 +4210,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4246,6 +4226,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4254,6 +4242,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4262,6 +4258,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4286,62 +4290,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -4350,6 +4298,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4358,6 +4314,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4366,6 +4330,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4374,6 +4346,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4382,6 +4362,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4390,6 +4378,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4398,6 +4394,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4426,62 +4430,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -4490,6 +4438,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4498,6 +4454,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4506,6 +4470,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4514,6 +4486,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4522,6 +4502,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4530,6 +4518,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4538,6 +4534,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4562,62 +4566,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -4626,6 +4574,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4634,6 +4590,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4642,6 +4606,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4650,6 +4622,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4658,6 +4638,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4666,6 +4654,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4674,6 +4670,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4698,62 +4702,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -4762,6 +4710,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4770,6 +4726,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4778,6 +4742,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4786,6 +4758,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4794,6 +4774,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4802,6 +4790,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4810,6 +4806,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4842,62 +4846,6 @@ UsePrecompiledHeader="0" /> - - - - - - - - - - - - - - - - - - - - - @@ -4906,6 +4854,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4914,6 +4870,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4922,6 +4886,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4930,6 +4902,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4938,6 +4918,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4946,6 +4934,14 @@ UsePrecompiledHeader="0" /> + + + @@ -4954,6 +4950,14 @@ UsePrecompiledHeader="0" /> + + +